CPU0이 eth1 인터럽트로 늪


12

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

보너스 질문 :에서 인터럽트 수를 줄이는 방법이 eth1있습니까?
Alexander Gladysh

답변:


10

찾는 위치 /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 선호도를 수동으로 업데이트해야합니다.


irqbalance이미 실행 중입니다. 어쩌면 올바르게 구성되어 있지 않습니까? 확인하는 방법?
Alexander Gladysh

어쩌면 irqbalance를 비활성화하고 재부팅해야합니다. 도움이되는지 확인하십시오. 인터럽트는 기본적으로 균형이 잘 맞습니다.
chutz

참고로 지금 /proc/irq/283/smp_affinity은 가지고 01있습니다 (아무도이 기계의 내용을 내가 아는 한 가장 좋은 것으로 바꾸지 않았습니다. 따라서 이것이 시스템 기본값이어야합니다).
Alexander Gladysh 2011

죄송합니다. 답변을 업데이트했습니다. irqbalance는 아마도 범인 일 것입니다. 그냥 제거하십시오. 나는 기본값이 무엇인지 모르지만 경험을 통해 기본값이 "모든 CPU"인 것을 보았습니다.
chutz

비활성화 irqbalance(경유 ENABLED=0의 것은 /etc/default/irqbalance) 도움이되지 않습니다. 재부팅 후 irqbalance입니다 stop/waiting,하지만 /proc/irq/283/smp_affinity여전히 01.
Alexander Gladysh

2

올바른 인텔 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 이더넷 컨트롤러를 사용하여 프로세서 코어에 인터럽트 할당


2

실제로 , 특히 짧은 기간 동안 반복적 인 프로세스를 처리 할 때, 장치 큐에 의해 생성 된 모든 인터럽트는 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 을 사용하여 수행 할 수 있습니다 .

이 답변은 사람들이 그것을 읽지 않을 길이에 가까워 지므로 자세히 설명하지는 않지만 상황에 따라 많은 솔루션이 있습니다 ... 소스를 확인하십시오 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.