Linux 네트워크의 SoftIRQ 및 빠른 패킷 처리

Linux 네트워크의 SoftIRQ 및 빠른 패킷 처리

금융 시장 데이터를 수신할 때 가장 빠른 패킷 처리 시간을 얻기 위해 Linux의 성능 튜닝에 대해 읽었습니다. NIC가 패킷을 받으면 DMA를 통해 메모리에 넣은 다음 HardIRQ를 발생시킵니다. 그러면 일부 NAPI 설정이 설정되고 SoftIRQ가 발생합니다. 그런 다음 SoftIRQ는 NAPI/장치 드라이버를 사용하여 폴링을 통해 RX 버퍼에서 데이터를 읽습니다. 그러나 이는 제한된 시간 동안만 실행됩니다(net.core.netdev_budget, 기본값은 300 패킷). 이는 Solarflare NIC를 사용하여 우분투를 실행하는 실제 서버와 관련이 있습니다. 내 질문은 다음과 같습니다.

  1. 각 HardIRQ가 SoftIRQ를 발생시키고 장치 드라이버가 한 번에 여러 패킷을 읽는 경우(netdev_budget), 한 번에 RX 버퍼에서 배출된 각 패킷에 의해 발생한 SoftIRQ는 어떻게 되나요?(수신된 각 팩은 하드 IRQ를 발생시킵니다. 그런 다음 소프트 irq)? 대기열에 있습니까?

  2. NAPI가 폴링을 사용하여 RX_buffer를 소모하는 이유는 무엇입니까? 시스템이 방금 SoftIRQ를 생성하고 RX 버퍼를 읽고 있는데 왜 폴링이 발생합니까?

  3. 아마도 Softirq를 통한 RX_Buffer 배수는 여러 RX_Buffer가 아닌 특정 RX_Buffer 1개에서만 발생합니까? 그렇다면 netdev_budget을 늘리면 다른 RX_buffers의 처리/드레이닝이 지연될 수 있습니까? 아니면 다른 RX_buffer를 다른 코어에 할당하여 이를 완화할 수 있습니까?

  4. HardIRQ가 즉시 발생하고 처리되도록 하는 설정이 있습니다. 그러나 SoftIRQ는 나중에 처리될 수 있습니다. 네트워크 RX와 관련된 SoftIRQ도 지연 없이 최우선적으로 처리되도록 하는 설정/구성이 있습니까?

답변1

4번 질문에 대한 답변과 관련하여,

예 네트워크 NIC 카드는 Softirq와 연결된 주변 장치입니다. Softirq는 모든 하위 절반 메커니즘에서 가장 높은 우선순위를 갖기 때문입니다.

따라서 나중에 패킷 삭제로 이어질 수 있는 지연을 방지하기 위해 Softirq가 사용됩니다.

기본적으로 NAPI 메커니즘은 몇 가지 이유로 인해 커널이 인터럽트 메커니즘으로 처리할 수 없는 속도로 들어오는 패킷을 처리하기 위한 것입니다.

LDD3의 네트워크 드라이버 장을 살펴보는 것이 좋습니다.여기같은 것에 도움이 될 수있는 링크입니다.

관련 정보