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/

注意测试时候需要分别测试数据上行和下行, 有时候小的数据量是测试不出问题的。