核心背景:为什么要调整 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:
系统运维