wireshark抓包问题及学习
【场景1】服务A请求服务B经常超过3s,报错i/o timeout,想看下是否网络波动或者负载太高。需要抓包分析。
问题1:
超时时间不定,且请求量过大,一直抓了存文件里抓包文件过大。
解决学习:
每10分钟覆盖重写文件,在确认慢请求复现后,立即停止抓包。
-i 指定监听的网络接口;
-G 指定每隔N秒就重新输出至新文件;
-W 指定输出文件的最大数量,到达后会重新覆写第 1 个文件;
-w 输出结果至文件。
sudo tcpdump -i eth0 -G 600 -W 1 -w /tmp/tcpdump.pacp
ps -ef|grep tcpdump # 获取tcpdump的进程号
kill -9 PID # 停止抓包
问题2:
在服务B的主机上抓取到包后找到对应慢请求时间段后,不知如何分析,是哪里的问题。
解决学习:
网络组同事帮忙排查,异常颜色报文中,显示Window:0,分析为窗口已满,给出了调大服务器上窗口值限制的建议。
cat /proc/sys/net/ipv4/tcp_window_scaling
cat /proc/sys/net/ipv4/tcp_rmem
cat /proc/sys/net/ipv4/wmem
参考 TCP系列32—窗口管理&流控—6、TCP zero windows和persist timer
理解触发zero window的原因和过程是:服务B所在主机的TCP端口一直接收数据,但是B应用层没有及时读取,数据一直在TCP模块中缓存,最终受限于主机接收缓存的大小,window size会变为0。
应用层面排查是因为服务B加载了太多引擎,导致一笔请求会处理很长时间,从应用层面解决是关闭无用引擎,减小处理耗时。