参考【https://www.cnblogs.com/zhangmingda/p/11671970.html】
链路层问题排查
netstat -i 查看关注的接口RX/TX-DRP和/RX/TX-OVR是否存在丢包
cat /proc/net/dev查看Receive与Transmit的fifo列,如果不为0说明存在ring buffer到达/生成速率高于内核处理速率,如果fifo数持续增大,确认CPU中断是否分配均匀:
cat /proc/interrupts | grep eth0 #获取中断号
cat /proc/irq/$eth0_irq_number
也可以尝试增加Ring Buffer的大小,通过ethtool -g eth0可以查看网卡设备Ring Buffer最大值,ethtool -G修改Ring Buffer当前设置,一般不建议这么做
检查有无内核backlog队列(内核从适配器收到包后交由协议栈处理前的缓冲队列)溢出情况:
cat /proc/net/softnet_stat
每一行代表每个CPU核的状态统计,从CPU0依次往下
每一列代表一个CPU核的各项统计:第一列代表中断处理程序收到的包总数;第二列即代表由于netdev_max_backlog队列溢出而被丢弃的包总数
解决方法:调整net.core.netdev_max_backlog
反向路由过滤:略,一般能ping通就不存在此问题
半连接队列溢出:通过netstat -natp | grep SYN_RECV | wc -l查看当前半连接数,与系统最大半连接数设置对比tcp_max_syn_backlog
链接跟踪数:
# 查看nf_conntrack表最大连接数
$ cat /proc/sys/net/netfilter/nf_conntrack_max
65536
# 查看nf_conntrack表当前连接数
$ cat /proc/sys/net/netfilter/nf_conntrack_count
7611
PAWS机制:netstat -s |grep -e "passive connections rejected because of time stamp" -e "packets rejects in established connections because of timestamp"
$ sysctl net.ipv4.tcp_tw_recycle
net.ipv4.tcp_tw_recycle = 1
$ sysctl net.ipv4.tcp_timestamps
net.ipv4.tcp_timestamps = 1
如果同时为1可能有问题
TIME_WAIT过高,设置tcp_tw_recycle = 1
开启 快速重传
mtr实时查看丢包率
ss -anti |grep -B 1 retrans 查看重传的具体端口
网络层问题排查
netstat -s
dmesg | grep -E "nf_conntrack:|table full|dropping package"