2.5. 增加 SoftIRQ 可在 CPU 上运行的时间
如果 SoftIRQ 没有运行足够长时间,则传入数据的速度可能会超过内核快速排空缓冲区的能力。因此,网络接口控制器(NIC)缓冲区溢出,数据包丢失。
如果 softirqd
进程无法在一个 NAPI 轮询周期中检索来自接口的所有数据包,则表示 SoftIRQ 没有足够的 CPU 时间。这种情况可能出现在具有快速 NIC 的主机上,如 10 Gbps 和更快。如果您增加了 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
# 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 ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此
awk
命令将/proc/net/softnet_stat
中的值从十六进制转换为十进制格式,并以表格式显示它们。每行代表核 0 开始的 CPU 核。相关的列有:
- 第一列:收到的总帧数。
-
第三列:
softirqd
进程不能在一个 NAPI 轮询周期中检索来自接口的所有数据包的次数。 - 最后一列:CPU 核号。
如果
/proc/net/softnet_stat
文件的第三列中的计数随着时间而递增,请调优系统:显示
net.core.netdev_budget_usecs
和net.core.netdev_budget
参数的当前值:sysctl 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这些设置,
softirqd
进程在一个轮询周期内最多有 2000 微秒来处理最多 300 个来自 NIC 的消息。轮询根据首先满足哪个条件而结束。使用以下内容创建
/etc/sysctl.d/10-netdev_budget.conf
文件:net.core.netdev_budget = 600 net.core.netdev_budget_usecs = 4000
net.core.netdev_budget = 600 net.core.netdev_budget_usecs = 4000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将参数设置为其当前值的两倍。
从
/etc/sysctl.d/10-netdev_budget.conf
文件中加载设置:sysctl -p /etc/sysctl.d/10-netdev_budget.conf
# sysctl -p /etc/sysctl.d/10-netdev_budget.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
监控
/proc/net/softnet_stat
文件中的第三列:awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t
# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果值还在增加,请将
net.core.netdev_budget_usecs
和net.core.netdev_budget
设置为更高的值。重复此过程,直到计数不再增加。