Linux Dropped监控与调优指南
在Linux系统中,“dropped”(丢弃)通常指网络数据包未被成功处理而丢弃的现象,主要发生在网络接口接收/发送缓冲区满、内核队列溢出、硬件故障或配置错误等场景。常见的丢包计数字段包括rx_dropped
(接收丢包)、tx_dropped
(发送丢包),可通过ethtool -S <接口名>
命令查看。
使用ethtool
查看网卡级别的丢包统计(重点关注rx_dropped
、tx_dropped
):
ethtool -S eth0 | grep -E 'rx_dropped|tx_dropped'
若这些字段持续增长,说明存在丢包问题。
通过iftop
(按流量排序)、nload
(实时带宽)工具监控网络流量,识别流量峰值导致的缓冲区溢出:
iftop -i eth0 # 实时查看接口流量及连接占用
nload -u M eth0 # 以MB/s为单位显示带宽使用率
若流量长期接近接口带宽上限(如千兆接口持续900Mbps+),可能引发丢包。
检查/var/log/syslog
或dmesg
输出,查找网络错误日志(如网卡故障、驱动问题):
dmesg | grep -i 'eth0\|error\|dropped'
若有类似"eth0: link down"或"NETDEV WATCHDOG: eth0 (igb): transmit queue 0 timed out"的日志,需进一步排查硬件或驱动。
使用ss
或netstat
查看内核积压队列(netdev_max_backlog
)的状态,判断是否因队列溢出导致丢包:
ss -lnt | grep eth0 # 查看接收队列长度(Recv-Q)
netstat -s | grep 'dropped' # 查看系统级丢包统计
若Recv-Q
值持续接近net.core.netdev_max_backlog
的默认值(1000),需调整该参数。
ethtool -l eth0
查看当前队列数,使用ethtool -L eth0 combined 8
启用多队列(队列数建议与CPU核心数匹配),减少中断争用。ethtool -G eth0 rx 4096 tx 4096 # 设置环形缓冲区为4MB(突发流量建议8192以上)
lspci -k
或lsmod
检查驱动版本,升级到最新稳定版(如Intel网卡驱动ixgbe
),修复已知bug。net.core.netdev_max_backlog
(默认1000),提升内核处理突发流量的能力:sysctl -w net.core.netdev_max_backlog=30000
sysctl -w net.ipv4.tcp_rmem='4096 131072 16777216' # 最小/默认/最大接收窗口
sysctl -w net.ipv4.tcp_wmem='4096 16384 16777216' # 发送窗口优化
sysctl -w net.core.rmem_max=16777216 # 最大接收缓冲区
sysctl -w net.core.wmem_max=16777216 # 最大发送缓冲区
sysctl -w net.ipv4.tcp_congestion_control=bbr
sysctl -w net.ipv4.tcp_fastopen=3 # 同时支持客户端和服务端
ethtool -K eth0 rx-checksum on tx-checksum on
sysctl -w net.ipv4.tcp_fin_timeout=30 # FIN等待时间(秒)
sysctl -w net.ipv4.tcp_synack_retries=2 # SYN-ACK重试次数
tc
工具对关键业务(如HTTP端口80)标记优先级,确保重要流量优先处理:tc qdisc add dev eth0 root handle 1: htb default 30 # 创建HTB队列
tc class add dev eth0 parent 1: classid 1:1 htb rate 1Gbit ceil 1Gbit # 父类带宽限制
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:1 # 将80端口流量划入高优先级类
echo 0f > /proc/irq/$(cat /proc/interrupts | grep eth0 | awk -F: '{print $1}')/smp_affinity # 绑定到CPU0-3
使用nginx
、haproxy
或硬件负载均衡器(如F5)分散流量,避免单台服务器负载过高导致丢包。例如,nginx
的upstream
模块可实现HTTP请求分发:
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
Prometheus
+Grafana
搭建网络性能监控面板,实时展示丢包率、吞吐量、延迟等指标,设置阈值告警(如丢包率超过0.1%触发邮件通知)。iperf3
模拟高并发流量,验证优化效果(如千兆网络环境下,优化后吞吐量应提升至800Mbps以上,丢包率<0.05%):iperf3 -c target_ip -P 16 -t 300 # 16线程持续5分钟测试