5.16. 调试网络问题¶
5.16.1. 背景¶
公司机房网络不稳定。最近一次因为机房两个交换机之间的一个链路有问题,导致特定tcp连接丢包。 花了不少时间来确认是网络的问题。将这个定位过程中使用到工具记录下来,方便以后使用。
5.16.2. 本机网络问题¶
内核是否网络相关的异常
dmesg
或者
vim /var/log/message
看是否网络相关的错误
本机网卡被打满了? 可以直接iftop查看
iftop
iftop可以查看本地与其他机器之间当前的网络带宽。
本机网卡是否有问题
ifconfig
主要关注errors和dropped, 如有有网络可能不正常。
5.16.3. 客户端与服务端问题¶
一般使用ping 检查客户端和服务端网络延时,是否有丢包现象
ping -c 30 server-ip -s 1448
-c 指定ping的个数, -s指定包的大小
另外需要注意的是: ping使用的ICMP(Internet Control Message Protocol), 不是TCP协议,有时候测试不出来基于TCP 的连接上的问题。
测试客户端和服务之间的网络带宽 在服务端启动一个iperf服务
iperf -s -i 1 &
从客户端发起测试
iperf -c server-ip -i 1
-s/c 标识服务端模式还是cient端 -i 为report周期, 默认使用的TCP协议
如果以上工具都无法确认网络问题,只能用tcpdump抓包取分析
tcpdump -X -i eth0 host $ip and tcp port $port > tcpdump.log
在客户端和服务端分别抓包,然后对比客户端和服务端的包,分析问题。
5.16.4. 端口问题¶
有时候网络没有问题,当时具体端口访问有问题, 可能的原因就是本机一些iptable策略,或者网络上的端口限制等 查看本机iptable策略
iptables -L
网络策略需要找网络工程师去核对。
5.16.5. 模拟应用程序¶
有时候为了排除应用程序的bug, 可以在服务器端口上启动一个标准服务(eg: ftp, http等),然后从客户端测试. 如果标准服务正常,说明更大可能是程序的bug,如果不正常,至少说明网络有问题.
简单的方法就是使用python 启动一个简单的http服务
python -m SimpleHTTPServer 8888
从客户端拉去数据
wget http://${ip}:8888/
注意测试时候需要分别测试数据上行和下行, 有时候小的数据量是测试不出问题的。