自动优化服务器网卡的收发队列(Ring Buffer)配置的bash shell脚本

核心背景:为什么要调整 Ring Buffer?

网卡的 RX/TX 环形队列(Ring Buffer)是网卡硬件缓存,作用是:

  • RX 队列:网卡接收到数据包后,先存入 RX 队列,再由内核读取处理;
  • TX 队列:内核要发送的数据包,先存入 TX 队列,再由网卡发送出去。

如果队列大小过小,高流量场景下会出现:

  • netstat -s | grep -i drop 显示 “rx/tx packets dropped”(包丢失);
  • 网络延迟增加、应用卡顿(如数据库 / WEB 服务超时)。

将队列设为硬件最大值,可最大化利用网卡缓存,减少丢包,提升网络吞吐。

脚本的核心目标是遍历所有有数据收发的网卡,将其 RX/TX 环形队列大小恢复为硬件默认最大值,是提升网卡网络吞吐、减少丢包的常用优化手段

# 步骤1:筛选有数据收发的网卡名称
cat /proc/net/dev | egrep ".+:" | awk '{if($5>0 || $13>0){print $0}}' | egrep -o ".+:" | sed 's/\(\ \|:\)//g;/^$/d' | while read _netdev_
do
    # 步骤2:定义队列类型(rx=接收,tx=发送)
    _Xxs_=(rx tx)
    
    # 步骤3:读取网卡RX/TX队列的硬件最大值
    _Mxs_=($(ethtool -g $_netdev_ 2>/dev/null | egrep "(RX|TX):" | head -n 2 | awk -F':' '{printf"%d ",$2}'))
    
    # 步骤4:遍历RX/TX,将队列大小设为硬件最大值
    for ((i=0;i<${#_Xxs_[@]};i++))
    do
        ethtool -G $_netdev_ ${_Xxs_[$i]} ${_Mxs_[$i]} 2>/dev/null
    done        
done

性能调优补充:

编辑 /etc/sysctl.conf

echo “net.core.rx_max_qlen = 4096” >> /etc/sysctl.conf

echo “net.core.netdev_max_backlog = 16384” >> /etc/sysctl.conf

echo “net.core.rmem_max = 16777216” >> /etc/sysctl.conf

echo “net.core.wmem_max = 16777216” >> /etc/sysctl.conf

生效配置

sysctl -p

Categories: 系统运维