2.5. CPU에서 SoftIRQs를 실행할 수 있는 시간 증가
SoftIRQ가 충분히 오래 실행되지 않으면 들어오는 데이터의 속도가 버퍼를 충분히 빨리 드레이닝하는 커널의 기능을 초과할 수 있습니다. 결과적으로 NIC(네트워크 인터페이스 컨트롤러) 버퍼 오버플로 및 패킷이 손실됩니다.
softirqd 프로세스에서 하나의 NAPI 폴링 주기의 인터페이스에서 모든 패킷을 검색할 수 없는 경우 SoftIRQ에 충분한 CPU 시간이 없다는 것을 나타냅니다. 이는 빠른 NIC가 있는 호스트의 경우(예: 10Gbps 이상)일 수 있습니다. net.core.netdev_budget 및 net.core.netdev_budget_usecs 커널 매개변수의 값을 늘리면 softirqd 가 폴링 주기에서 처리할 수 있는 시간 및 수를 제어할 수 있습니다.
프로세스
net.core.netdev_budget매개변수를 튜닝해야 하는지 확인하려면/proc/net/softnet_stat파일에 카운터를 표시합니다.# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t 221951548 0 0 0 0 0 0 0 0 0 0 0 0 192058677 0 20380 0 0 0 0 0 0 0 0 0 1 455324886 0 0 0 0 0 0 0 0 0 0 0 2 ...이
awk명령은/proc/net/softnet_stat의 값을 16진수 형식에서 10진수 형식으로 변환하고 테이블 형식으로 표시합니다. 각 행은 core 0부터 시작하는 CPU 코어를 나타냅니다.관련 열은 다음과 같습니다.
- 첫 번째 열: 수신된 총 프레임 수입니다.
-
세 번째 열: 하나의 NAPI 폴링 주기에서 인터페이스에서 모든 패킷을 검색할 수 없는
소프트irqd프로세스 수입니다. - 마지막 열: CPU 코어 번호입니다.
/proc/net/softnet_stat파일의 세 번째 열에 있는 카운터가 시간에 따라 증가하면 시스템을 조정합니다.net.core.netdev_budget_usecs및net.core.netdev_budget매개변수의 현재 값을 표시합니다.# sysctl net.core.netdev_budget_usecs net.core.netdev_budget net.core.netdev_budget_usecs = 2000 net.core.netdev_budget = 300이러한 설정을 사용하면
softirqd프로세스는 NIC에서 최대 300개의 메시지를 하나의 폴링 주기로 처리할 수 있도록 최대 2000 마이크로초까지 사용할 수 있습니다. 폴링은 가장 먼저 충족되는 조건에 따라 종료됩니다.다음 콘텐츠를 사용하여
/etc/sysctl.d/10-netdev_budget.conf파일을 만듭니다.net.core.netdev_budget = 600 net.core.netdev_budget_usecs = 4000매개 변수를 현재 값의 이중으로 설정합니다.
/etc/sysctl.d/10-netdev_budget.conf파일에서 설정을 로드합니다.# sysctl -p /etc/sysctl.d/10-netdev_budget.conf
검증
/proc/net/softnet_stat파일에서 세 번째 열을 모니터링합니다.# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t값이 계속 증가하는 경우
net.core.netdev_budget_usecs및net.core.netdev_budget를 더 높은 값으로 설정합니다. 카운터가 더 이상 증가하지 않을 때까지 이 프로세스를 반복합니다.