1.3. 调优网络设备积压队列以避免数据包丢弃
当网卡接收数据包并在内核协议堆栈处理它们之前,内核会将这些数据包存储在积压队列中。内核为每个 CPU 核维护一个单独的队列。
如果核的积压队列满了,则内核会丢弃将来 netif_receive_skb() 内核函数分配给此队列的所有传入的数据包。如果服务器包含 10 Gbps 或更快的网络适配器或多个 1 Gbps 适配器,请调优积压队列大小,以避免此问题发生。
先决条件
- 一个 10 Gbps 或更快或多个 1 Gbps 网络适配器
流程
确定是否需要调整积压队列,显示
/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 18862 0 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中的值从十六进制转换为十进制格式,并以表格式显示它们。每行代表核 0 开始的 CPU 核。相关的列有:
- 第一列:收到的总帧数
- 第二列:由于积压队列满了而丢弃的帧数
- 最后一列:CPU 核数
如果
/proc/net/softnet_stat文件的第二列中的值随着时间而递增,请增加积压队列的大小:显示当前积压队列大小:
# sysctl net.core.netdev_max_backlog net.core.netdev_max_backlog = 1000使用以下内容创建
/etc/sysctl.d/10-netdev_max_backlog.conf文件:net.core.netdev_max_backlog = 2000将
net.core.netdev_max_backlog参数设置为当前值的两倍。从
/etc/sysctl.d/10-netdev_max_backlog.conf文件中载入设置:# sysctl -p /etc/sysctl.d/10-netdev_max_backlog.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_max_backlog值。重复此过程,直到数据包丢弃计数不再增加。