1.3. 调优网络设备积压队列以避免数据包丢弃


当网卡接收数据包并在内核协议堆栈处理它们之前,内核会将这些数据包存储在积压队列中。内核为每个 CPU 核维护一个单独的队列。

如果核的积压队列满了,则内核会丢弃将来 netif_receive_skb() 内核函数分配给此队列的所有传入的数据包。如果服务器包含 10 Gbps 或更快的网络适配器或多个 1 Gbps 适配器,请调优积压队列大小,以避免此问题发生。

先决条件

  • 一个 10 Gbps 或更快或多个 1 Gbps 网络适配器

流程

  1. 确定是否需要调整积压队列,显示 /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 核数
  2. 如果 /proc/net/softnet_stat 文件的第二列中的值随着时间而递增,请增加积压队列的大小:

    1. 显示当前积压队列大小:

      # sysctl net.core.netdev_max_backlog
      net.core.netdev_max_backlog = 1000
    2. 使用以下内容创建 /etc/sysctl.d/10-netdev_max_backlog.conf 文件:

      net.core.netdev_max_backlog = 2000

      net.core.netdev_max_backlog 参数设置为当前值的两倍。

    3. /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 值。重复此过程,直到数据包丢弃计数不再增加。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部