금융 시장 데이터를 수신할 때 가장 빠른 패킷 처리 시간을 얻기 위해 Linux 성능 튜닝에 대해 읽었습니다. NIC가 패킷을 수신하면 DMA를 통해 메모리에 넣은 다음 HardIRQ를 발생시킵니다. 그러면 일부 NAPI 설정이 설정되고 SoftIRQ가 발생합니다. 그런 다음 SoftIRQ는 NAPI/장치 드라이버를 사용하여 폴링을 통해 RX 버퍼에서 데이터를 읽습니다. 그러나 이는 제한된 시간 동안만 실행됩니다(net.core.netdev_budget, 기본값은 300개 패킷). 이는 Solarflare NIC를 사용하여 우분투를 실행하는 실제 서버에 대한 것입니다. 내 질문은 다음과 같습니다.
SoftIRQ가 HardIRQ별로 발생하고 장치 드라이버가 한 번에 여러 패킷을 읽는 경우(netdev_budget) RX 버퍼에서 배출된 모든 패킷에 대해 한 번에 발생한 SoftIRQ는 어떻게 되나요(수신된 각 패킷은 하드 IRQ를 발생시킵니다). 소프트 IRQ)? 이거 다 줄 서 있는 거야?
NAPI가 폴링을 사용하여 RX_buffer를 소모하는 이유는 무엇입니까? 시스템이 방금 SoftIRQ를 생성하고 RX 버퍼를 읽고 있는데 왜 폴링을 하는 걸까요?
아마도 Softirq를 통한 RX_Buffer 고갈은 여러 RX_Buffer가 아닌 특정 RX_Buffer 1개에서만 발생합니까? 그렇다면 netdev_budget을 늘리면 다른 RX_buffers의 처리/소진이 지연됩니까? 아니면 다른 RX_buffer를 다른 코어에 할당하여 이를 완화할 수 있습니까?
HardIRQ가 즉시 발생하고 처리되도록 하는 설정이 있습니다. 그러나 SoftIRQ는 나중에 처리될 수 있습니다. 네트워크 RX와 관련된 SoftIRQ도 지연 없이 가장 높은 우선순위로 처리되도록 하는 설정/구성이 있습니까?
답변1
네 번째 질문에 대한 답변과 관련하여,
예, 네트워크 카드는 소프트 인터럽트와 관련된 주변 장치입니다. 소프트 인터럽트는 모든 하위 메커니즘 중에서 가장 높은 우선순위를 갖기 때문입니다.
따라서 후속 패킷 손실로 이어질 수 있는 지연을 방지하기 위해 Softirq가 사용됩니다.
기본적으로 NAPI 메커니즘은 어떤 이유로든 인터럽트 메커니즘을 사용하는 커널에서 처리할 수 없는 속도로 패킷을 처리하도록 설계되었습니다.
LDD3의 네트워크 드라이버 장으로 바로 이동하는 것이 좋습니다.여기이에 대한 유용한 링크입니다.