NIC 폴링 대 인터럽트가 필요한 네트워크로드는 무엇입니까?


18

누구든지 프레임 통합 (NAPI)이 필요할 때와 프레임 당 단일 인터럽트가 충분할 때 대답 할 수있는 일부 데이터 또는 기본 계산이 있습니까?

내 하드웨어 : IBM BladeServer HS22, Broadcom 5709 기가비트 NIC 하드웨어 (MSI-X), 이중 Xeon E5530 쿼드 코어 프로세서. 주요 목적은 오징어 프록시 서버입니다. 스위치는 멋진 Cisco 6500 시리즈입니다.

우리의 기본 문제는 피크 타임 (100Mbps 트래픽, 10,000pps) 동안 대기 시간과 패킷 손실이 증가한다는 것입니다. 2.6.38로 많은 조정 및 커널 업그레이드를 수행했으며 패킷 손실이 개선되었지만 대기 시간이 여전히 부족합니다. 핑은 산발적입니다. 로컬 Gbps LAN에서 200ms까지 점프 CPU / 메모리로드가 양호하더라도 오징어 평균 응답이 30ms에서 500 + ms로 증가합니다.

인터럽트는 피크 동안 약 15,000 / 초로 올라갑니다. Ksoftirqd는 많은 CPU를 사용하지 않습니다. 모든 코어에서 IRQ (eth0 및 eth1 각각 8)의 균형을 맞추기 위해 irqbalance를 설치했지만 그다지 도움이되지 않았습니다.

인텔 NIC에는 이러한 종류의 문제가없는 것으로 보이지만 블레이드 시스템 및 고정 구성 하드웨어의 사실을 수행하면 Broadcom에 갇혀 있습니다.

모든 것이 NIC를 주범으로 지적하고 있습니다. 내가 지금 가지고있는 가장 좋은 아이디어는 대기 시간을 줄이고 처리량을 높이면서 인터럽트를 줄이려고 시도하는 것입니다.

불행히도 bnx2는 adaptive-rx 또는 tx를 지원하지 않습니다.

적응 인터럽트 대 NAPI 스레드 대답은 인터럽트 조절의 큰 이상보기 만에 구체적인 정보를 제공하는 방법을 계산 최적의 ethtool을 병합 설정 주어진 문제를 해결하기위한 것이다. 시행 착오보다 나은 접근 방법이 있습니까?

위에서 언급 한 워크로드 및 하드웨어 구성에도 NAPI가 필요합니까? 아니면 패킷 당 단일 인터럽트로 작동 할 수 있어야합니까?


어려운 질문이어야합니다. 현상금에 감사드립니다, @Holocryptic! 나는 통합을위한 "ethtool -c"설정을 시도했지만 눈에 띄는 차이는 없습니다.
Wim Kerkhoff

문제 없어요. 방금 며칠 동안 머무르는 것을 보았고 좋은 질문처럼 보였습니다. 누군가가 당신을 위해 무언가를 가지고 있기를 바랍니다.
Holocryptic

또 다른 업데이트 ... 우리는 Emulex 10 Gbps NIC를 사용하여 IBM HS23 블레이드로 이전했습니다. 이번 주에 우리는 초당 800,000 패킷 이상을 기록했습니다. IRQ의로드 밸런싱을 위해 많은 튜닝 (리눅스 커널 드라이버 패치)을 수행해야했지만 지금은 훌륭하게 작동하고 있습니다.
Wim Kerkhoff 2

답변:


6

그것을 시도하고 알아 내기 위해 약간의 독서를했던 훌륭한 질문. 나는 대답이 있다고 말할 수 있지만 ... 어쩌면 힌트가있을 수 있습니다.

나는 적어도 당신의 질문에 대답 할 수 있습니다. "패킷 당 단일 인터럽트로 살 수 있을까요?" 나는 내가 액세스 할 수있는 매우 바쁜 방화벽을 기반으로 대답이 그렇다고 생각합니다.

Sar 출력 :

03:04:53 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
03:04:54 PM        lo     93.00     93.00      6.12      6.12      0.00      0.00      0.00
03:04:54 PM      eth0 115263.00 134750.00  13280.63  41633.46      0.00      0.00      5.00
03:04:54 PM      eth8  70329.00  55480.00  20132.62   6314.51      0.00      0.00      0.00
03:04:54 PM      eth9  53907.00  66669.00   5820.42  21123.55      0.00      0.00      0.00
03:04:54 PM     eth10      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:04:54 PM     eth11      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:04:54 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:04:54 PM      eth2 146520.00 111904.00  45228.32  12251.48      0.00      0.00     10.00
03:04:54 PM      eth3    252.00  23446.00     21.34   4667.20      0.00      0.00      0.00
03:04:54 PM      eth4      8.00     10.00      0.68      0.76      0.00      0.00      0.00
03:04:54 PM      eth5      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:04:54 PM      eth6   3929.00   2088.00   1368.01    183.79      0.00      0.00      1.00
03:04:54 PM      eth7     13.00     17.00      1.42      1.19      0.00      0.00      0.00
03:04:54 PM     bond0 169170.00 201419.00  19101.04  62757.00      0.00      0.00      5.00
03:04:54 PM     bond1 216849.00 167384.00  65360.94  18565.99      0.00      0.00     10.00

보시다시피 초당 매우 높은 패킷 수를 계산 하고이 기계에서 특별한 ethtool 조정이 수행되지 않았습니다. 아 ... 그래도 인텔 칩셋. : \

유일하게 수행 된 작업은 인터페이스별로 / proc / irq / XXX / smp_affinity를 사용한 일부 수동 irq 밸런싱이었습니다. 왜 그들이 irqbalance 대신에 그런 식으로 가기로 선택했는지 잘 모르겠지만 작동하는 것 같습니다.

또한 귀하의 질문에 대답하는 데 필요한 수학에 대해 생각했지만 너무 많은 변수가 있다고 생각합니다. 요약하자면, 대답은 '아니요'입니다. 여기에서 결과를 예측할 수는 없다고 생각하지만 충분한 데이터를 캡처하면 더 나은 수준으로 조정할 수 있습니다.

모든 것을 말하면, 내 직감은 어떤 종류의 펌웨어 또는 interop 버그에서와 같이 하드웨어 바운드입니다.


여기에 유용한 배경이 있습니다 : alexonlinux.com/…
DictatorBob

1
기본 진술 "예, 문제가 없어야 함"에 동의하지만 문제가있는 방식으로 보면 펌웨어 또는 드라이버 문제 일 수 있습니다. 나는 내 워크 스테이션을 전혀 "조정하지"않았으며 땀을 흘리지 않고 65kips를 당길 수있다. 15kips는 최신 CPU에 영향을 미치지 않아야합니다. 나는 Broadcom NIC를 독점적으로 사용하는데, 5709가 가장 보편적입니다. 그러나이 테스트는 Linux가 아닌 FreeBSD에서 실행되었습니다.
Chris S

아이디어 주셔서 감사합니다. irqbalance를 시도했지만 아무런 차이가 없었습니다. 나는 더 많은 유착 설정 (ethtool -c)을 가지고 놀았지만 아무런 차이점을 느끼지 못했습니다. 블레이드 중 하나는 실제로로드 밸런서이며 초당 최대 120,000 패킷을 밀어냅니다. NAT 및 conntrack iptables가로드되면 ksoftirqd CPU 사용량이 100 %가됩니다. 해당 모듈을 언로드하고로드를 0으로 떨어 뜨립니다. Squid 서버 (최대 10,000 패킷 / 초)에서 17,000 (!!!) iptables 규칙을 플러시하고 대기 시간이 즉시 줄었습니다. 나는 그 전에 시도,하지만 분명히하지 ... 생각했다
빔 Kerkhoff을

3

확실히 적은 양의 트래픽과 비교할 때 CPU, 칩셋 및 버스 기능이 제공되므로 어떤 형태의 인터럽트 관리도 필요하지 않습니다. 우리는 10Gbps NIC를 가진 여러 개의 RHEL 5.3 64 비트 머신을 가지고 있으며 그 인터럽트는 전혀 나쁘지 않습니다. 이것은 100 배나 적습니다.

분명히 당신은 고정 구성 (나는 꽤 비슷한 HP의 블레이드를 사용)을 가지고 있으므로 인텔을위한 NIC 교체는 쉬운 옵션이지만이 포럼과 다른 곳에서 비슷한 문제를 발견하기 시작했습니다. 특정 Broadcom NIC를 사용합니다. SE 사이트 자체는 이러한 불일치에 대해 몇 가지 문제가 있었고 인텔 NIC로 교체하는 것이 절대적으로 도움이되었습니다.

내가 권장하는 것은 단일 블레이드를 선택하고 해당 시스템에 인텔 기반 어댑터를 추가하는 것입니다. 신호를 얻기 위해 상호 연결 또는 IBM이 호출하는 모든 것을 추가해야하지만 동일한 소프트웨어 설정을 시도하지만 다른 소프트웨어를 사용해보십시오 NIC (가능한 경우 Broadcom을 비활성화 할 수 있음). 이것을 테스트하고 어떻게 진행하는지 살펴보십시오. 내가 설명한 것은 몇 비트의 추가 하드웨어가 필요하다는 것을 알고 있지만 IBM 담당자가 행복하게 빌려 줄 것입니다. 확실히 알 수있는 유일한 방법입니다. 발견 한 내용을 알려주십시오. NIC가 이상한 경우라도 NIC에 문제가 있으면 진심으로 관심이 있습니다. 따로 나는 다음주에 인텔과 브로드 컴과의 만남을 갖고 전혀 관련이없는 것을 논의 할 것이지만, 그들과 반드시 ​​논의하고 관심있는 것을 발견하면 알려 드리겠습니다.


1

인터럽트에 대한 질문은 인터럽트가 전체 시스템 성능에 어떤 영향을 미치는지입니다. 인터럽트는 사용자 및 커널 랜드 처리를 선점 할 수 있으며 CPU 사용량이 많지 않을 수 있지만 컨텍스트 전환이 많이 발생하고 성능이 크게 저하됩니다. 당신이 사용할 수있는 vmstat및 확인 system열을, cs인터럽트 및 문맥 헤더는 그 가치도 체크, 초당 (당신이 그 체중해야한다 있도록 인터럽트 시계를 포함한다)으로 전환됩니다.


1

짧은 직접 답변 :

폴링을 활성화하면 컨텍스트 전환 (일반적으로 interupts로 인해)이 현재 상태 (귀하의 15kips)에서 미리 결정된 수 (보통 1k에서 2k)로 줄어 듭니다.

현재 미리 정해진 수를 초과하는 트래픽이있는 경우 폴링을 활성화하여 응답 시간이 향상되어야합니다. 대화도 마찬가지입니다. 컨텍스트 스위치가 성능에 영향을 미치지 않는 한 이것이 "필수"라고 말하지 않겠습니다.


1

후속 조치 : NAT 및 conntrack 모듈이 언로드되고 최소화 된 iptables 규칙 세트를 사용하면 뛰어난 성능을 얻을 수 있습니다. IPVS로드 밸런서는 900Mbps / 150kpps 이상을 수행했습니다. 이것은 여전히 ​​동일한 Broadcom bnx2 칩셋을 사용하는 중입니다.

결론적으로 인터럽트 처리는 괜찮은 것으로 보이며 2.6.38 / 3.0.x 커널을 사용하는 데비안의 경우 기본값은 괜찮습니다.

확실히 표준 데비안 패키지를 사용할 수 있도록 인텔 NIC를 사용하고 싶습니다. 무료 인 bnx2 펌웨어와의 싸움은 많은 시간을 낭비했습니다.


또 다른 업데이트입니다. 최근에는 명백한 이유없이 성능이 다시 저하되었습니다. 우리는 모든 이전 최적화를 성공적으로 검토했습니다. 인텔 NIC는 여전히 경제적 인 옵션이 아닙니다 (새로운 인터커넥트, 10GB 스위치 등에 $ 30- $ 40,000 투자). 그러나 여전히 크 래피 bnx2를 사용하지만 최신 펌웨어를 사용하는 약간 더 새로운 IBM HS22 블레이드를 찾았습니다. 성능이 훨씬 우수합니다. 초당 150,000 개의 패킷이 차단되었습니다.
Wim Kerkhoff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.