Ubuntu 기반 Xen XCP 내에서 실행되는 Ubuntu VM이 있습니다. 뒤에 사용자 지정 FCGI 기반 HTTP 서비스를 호스팅합니다 nginx
.
첫 번째 CPU 코어의 언더로드 ab
가 포화 상태이고 나머지는 언더로드됩니다.
에서 /proc/interrupts
내가 보는 그 CPU0는 다른 코어에 비해 크기보다 인터럽트의 순서를 제공합니다. 그들 대부분은에서 온 것입니다 eth1
.
이 VM의 성능을 향상시키기 위해 수행 할 수있는 작업이 있습니까? 인터럽트를보다 고르게 균형 잡는 방법이 있습니까?
처참한 세부 사항 :
$ uname -a Linux MYHOST 2.6.38-15- 가상 # 59- 우분투 SMP 금요일 4 월 27 일 16:40:18 UTC 2012 i686 i686 i386 GNU / Linux $ lsb_release -a 사용 가능한 LSB 모듈이 없습니다. 배급 자 ID : 우분투 설명 : 우분투 11.04 출시 : 11.04 코드 네임 : natty $ 고양이 / proc / interrupts CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 283 : 113720624 0000 xen-dyn-event eth1 284 : 000 000 xen-dyn-event eth0 285 : 2254 0 3873799 000 xen-dyn-event blkif 286 : 020 000 xen-dyn-event hvc_console 287 : 492 400000 295324 xen-dyn-event xenbus 288 : 000 000 222294 젠 퍼크 -ipi 통화 289 : 000 000 xen-percpu-virq 디버그 7 290 : 000 151302 xen-percpu-ipi callfunc7 291 : 000 0003236015 xen-percpu-ipi resched7 292 : 00060064 xen-percpu-ipi spinlock7 293 : 000 000 12355510 젠 퍼크 퍼크 타이머 7 294 : 000 803174 xen-percpu-ipi 전화 기능 295 : 000 000 xen-percpu-virq 디버그 6 296 : 00060027 0 xen-percpu-ipi callfunc6 297 : 000 5374762 xen-percpu-ipi 재조정 6 298 : 000 64976 0 xen-percpu-ipi spinlock6 299 : 000 15294870 xen-percpu-virq 타이머 6 300 : 000 000 264441 xen-percpu-ipi 통화 기능 301 : 000 000 xen-percpu-virq 디버그 5 302 : 000 79324 000 xen-percpu-ipi callfunc5 303 : 000 3468144 xen-percpu-ipi resched5 304 : 000 66269 xen-percpu-ipi spinlock5 305 : 000 12778464 xen-percpu-virq 타이머 5 306 : 000 844591 000 xen-percpu-ipi 통화 기능 307 : 000 000 xen-percpu-virq 디버그 4 308 : 000 75293 000 xen-percpu-ipi callfunc4 309 : 000 3482146 000 xen-percpu-ipi resched4 310 : 000 79312 000 xen-percpu-ipi spinlock4 311 : 000 21642424 000 xen-percpu-virq 타이머 4 312 : 00 449141 000 xen-percpu-ipi 통화 기능 313 : 000 000 xen-percpu-virq 디버그 3 314 : 000 95405 000 xen-percpu-ipi callfunc3 315 : 00 3802992 000 xen-percpu-ipi resched3 316 : 0 76607 000 xen-percpu-ipi spinlock3 317 : 00016439729 000 xen-percpu-virq 타이머 3 318 : 00 876383 000 xen-percpu-ipi callfuncsingle2 319 : 000 000 xen-percpu-virq 디버그 2 320 : 0 76416 000 xen-percpu-ipi callfunc2 321 : 00 3422476 000 xen-percpu-ipi resched2 322 : 00 69217 000 xen-percpu-ipi spinlock2 323 : 00 10247182 000 xen-percpu-virq 타이머 2 324 : 0 393514 0000 xen-percpu-ipi callfuncsingle1 325 : 000 000 xen-percpu-virq 디버그 1 326 : 0 95773 000 xen-percpu-ipi callfunc1 327 : 0 3551629 000 xen-percpu-ipi resched1 328 : 0 77823 000 0 xen-percpu-ipi spinlock1 329 : 0 13784021 000 xen-percpu-virq 타이머 1 330 : 730435 000 xen-percpu-ipi 통화 기능 331 : 000 000 xen-percpu-virq 디버그 0 332 : 39649 000 xen-percpu-ipi callfunc0 333 : 3607120 0000 xen-percpu-ipi resched0 334 : 348740 000 xen-percpu-ipi spinlock0 335 : 89912004 0000 xen-percpu-virq 타이머 0 NMI : 0000 0000 마스크 불가능 인터럽트 LOC : 000 000 로컬 타이머 인터럽트 SPU : 000 000 스퓨리어스 인터럽트 PMI : 000 000 성능 모니터링 인터럽트 IWI : 0000 IRQ 작업 인터럽트 결과 : 3607120 3551629 3422476 3802992 3482146 3468144 5374762 3236015 일정 변경 인터럽트 CAL : 770084 489287 952799 544546 919884 343765 863201 373596 함수 호출 인터럽트 TLB : 000 000 TLB 슛 다운 TRM : 000 000 열 이벤트 인터럽트 THR : 000 000 임계 값 APIC 인터럽트 MCE : 000 000 기계 점검 예외 MCP : 000 000 기계 점검 폴링 오류 : 0 MIS : 0
답변
찾는 위치 /proc/irq/283
디렉토리. 가 smp_affinity_list
있는 CPU를 쇼는 283 인터럽트를 얻을 것이다 파일. 당신을 위해이 파일은 아마도 “0”을 포함 할 것입니다 (그리고 smp_affinity
아마도 “1”을 포함 할 것입니다).
CPU 범위를 smp_affinity_list
파일에 쓸 수 있습니다 .
echo 0-7 | sudo tee /proc/irq/283/smp_affinity_list
또는 각 비트가 CPU에 해당하는 비트 마스크를 다음과 같이 쓸 수 있습니다 smp_affinity
.
printf %x $((2**8-1)) | sudo tee /proc/irq/283/smp_affinity
그러나 irqbalance 는 각 인터럽트의 친화력에 대한 자체 아이디어를 가지고 있으며 업데이트를 되돌릴 수 있습니다. 따라서 irqbalance를 완전히 제거하는 것이 가장 좋습니다. 또는 적어도 중지하고 재부팅시 나타나지 않도록하십시오.
irqbalance가 없어도 smp_affinity
재부팅 후 인터럽트 283이 발생할 경우 시작 스크립트 중 하나에서 CPU 선호도를 수동으로 업데이트해야합니다.
답변
올바른 인텔 NIC 모델이 있으면 성능을 크게 향상시킬 수 있습니다.
첫 번째 단락을 인용하려면 :
멀티 코어 프로세서와 최신 이더넷 어댑터 (82575, 82576, 82598 및 82599 포함)를 사용하면 개별 코어에 실행 흐름을 할당하여 TCP 전달 흐름을 최적화 할 수 있습니다. 기본적으로 Linux는 프로세서 코어에 인터럽트를 자동으로 할당합니다. 인터럽트를 자동으로 할당하는 두 가지 방법, 즉 사용자 공간에 커널 IRQ 밸런서와 IRQ 밸런스 데몬이 있습니다. 두 가지 모두 CPU 사용량을 낮출 수 있지만 IP 전달 속도를 최대화하지 않는 트레이드 오프를 제공합니다. 이더넷 어댑터의 대기열을 특정 프로세서 코어에 수동으로 고정하여 최적의 처리량을 얻을 수 있습니다.
IP 전달의 경우, 송수신 큐 쌍은 동일한 프로세서 코어를 사용해야하며 서로 다른 코어 간의 캐시 동기화를 줄여야합니다. 특정 코어에 송신 및 수신 인터럽트를 할당하여 수행 할 수 있습니다. Linux 커널 2.6.27부터 82575, 82576, 82598 및 82599에서 다중 큐를 사용할 수 있습니다. 또한 다중 전송 큐가 MSI-X (Extended Messaging Signaled Interrupts)에서 활성화되었습니다. MSI-X는 사용할 수있는 많은 수의 인터럽트를 지원하므로 특정 CPU에 대한 인터럽트를보다 세밀하게 제어하고 타겟팅 할 수 있습니다.
참조 : 인텔 ® 82575/82576 또는 82598/82599 이더넷 컨트롤러를 사용하여 프로세서 코어에 인터럽트 할당
답변
실제로 , 특히 짧은 기간 동안 반복적 인 프로세스를 처리 할 때, 장치 큐에 의해 생성 된 모든 인터럽트는 IRQ 밸런싱 대신 동일한 CPU에 의해 처리 되므로 단일 CPU가 eth1 인터럽트를 처리하면 더 나은 성능을 볼 수 있습니다. *** 아래에 제공된 예외
위에 링크 된 소스는 Linux Symposium에서 가져온 것으로 SMP IRQ Affinity 에 대한 몇 개의 단락을 읽어 보는 것이 좋습니다 .이 게시물보다 더 효과적으로 확신 할 수 있기 때문입니다.
왜?
메인 프로세서에 액세스 할 수있는 것 외에 각 프로세서마다 자체 캐시가 있음을 상기 하십시오 . 이 다이어그램을 확인하십시오 . 인터럽트가 트리거되면 CPU 코어는 주 메모리에서 인터럽트를 처리하기 위해 명령어를 가져와야합니다. 캐시에서 명령어가있는 경우보다 훨씬 오래 걸립니다. 프로세서가 작업을 실행하면 캐시에 해당 명령이 포함됩니다. 이제 동일한 CPU 코어가 거의 항상 동일한 인터럽트를 처리한다고 가정하면 인터럽트 처리기 기능은 CPU 코어 캐시를 떠나서 커널 성능을 향상시킬 수 없습니다.
또는 IRQ가 균형 잡히면 다른 CPU에서 인터럽트를 지속적으로 처리하도록 할당 할 수 있습니다. 새 CPU 코어에는 캐시에 인터럽트 처리기 기능이 없을 수 있으며 메인에서 적절한 처리기를 얻으려면 오랜 시간이 필요합니다 기억.
예외 : eth1 인터럽트를 거의 사용하지 않는 경우 다른 작업을 수행하여 캐시를 덮어 쓰는 데 충분한 시간이 걸리는 것을 의미합니다. 즉, 인터페이스가 간헐적으로 해당 인터페이스를 통해 간헐적으로 오는 데이터를 가지고 있음을 의미합니다. 고주파에서 프로세스를 사용할 때입니다.
결론
인터럽트가 매우 자주 발생 하면 특정 CPU에서만 처리 할 수 있도록 해당 인터럽트를 바인딩하십시오. 이 구성은
/proc/'IRQ number'/smp_affinity
또는
/proc/irq/'IRQ number'/smp_affinity
위에 링크 된 소스에서 SMP IRQ 선호도 섹션 의 마지막 단락을 참조하십시오 . 여기에는 지침이 있습니다.
대안 적으로
네트워크가 허용하는 경우 MTU 크기 (점보 프레임)를 늘리거나 매 패킷이 아닌 많은 양의 패킷을 수신 한 후 플래그를 올리도록 변경하여 인터럽트 플래그가 발생하는 빈도를 변경할 수 있습니다. 시간이 초과되므로 일정 시간이 지나면 인터럽트를 발생시킵니다. 시간이 다 떨어지기 전에 버퍼 크기가 가득 찰 수 있으므로 시간 옵션에주의하십시오. 이것은 링크 된 소스에 요약 된 ethtool 을 사용하여 수행 할 수 있습니다 .
이 답변은 사람들이 그것을 읽지 않을 길이에 가까워 지므로 자세히 설명하지는 않지만 상황에 따라 많은 솔루션이 있습니다 … 소스를 확인하십시오 🙂