网络质量评估

评估一个 IDC 网络质量可以从下面几个方面入手:

带宽(throughput):网络的吞吐率,端到端之间可以传输的最大速率,这个指标不管是在测试还是正式使用 IDC 服务的时候,都会限死,带宽当然是越大越好,一般超过限制带宽的 50% 就会出现严重的丢包,这个可以通过 nc, wget, curl, iperf, scp 等工具测试。
延时(latency),数据包从本地传输到对端之间需要的时间,如果使用 ping 来测试话,可以通过其 RTT 来反映其状况。
丢包(loss),这个指标应该适用于任何的 web 应用,越大质量越差,这个可以通过 ping, iperf 等实现。
抖动(jitter),我们肯定希望 latency 稳定在某个区间上,如果 latency 出现比较的的抖动,也可以从一定程度说明网络质量问题,iperf UDP 可以测试,看 ping 结果的 mdev 同样可以得出比较靠谱的结论。

下面介绍几个常用的网络质量评估的工具机器用法。

1. ping
基本的网络延时、丢包可以通过 ping 实现,如果某个 IP 出现大量的丢包,可以肯定该 IP 提供的服务或者是中间线路出现了问题。这篇文档划分了 5 个等级来描述丢包率:
0-1 good
1-2.5 acceptable
2.5-5 poor
5-12 very poor
>12 bad(unusable for interactive work)

因此我们需要将丢包尽量控制在 2.5 内,这个除了我们服务做的到位稳定外,从客户到中途的传输也会起很大的作用。

2. fping
第一个介绍的 ping 发送的 ICMP 包的大小固定,并不能完全模拟真实的网络世界,这点可以通过 fping 实现。并且使用 ping 来测试会消耗大量的时间,但是使用 fping 则不会出现此类情况,fping 给某个 IP 发送完 ICMP 之后会立即进入下一轮接着发送下一个包,有点类似异步的模式,因此这样的效率会比较高。

$ fping -g 202.101.119.112/26

或者将需要扫描的 IP 写入到文件:
$ cat IP
8.8.8.8
8.8.4.4
$ fping -f IP

$ fping -a -g 64.90.41.232 64.90.41.245 -s
$ fping -c/-C 100 64.90.41.232

比较重要的是 -b 参数,他可以用来改变 ICMP 包大小:
$ fping -b 1000 -c 100 220.181.111.188

更详细的文档请看这里

前两个工具差不多能解决一般的问题了,如果从某个检测点监控需要评估的网络,ping 的延时大,抖动厉害,排除监控网络的问题,剩下的就是被监控网络质量的问题了。

3. nc(netcat)
netcat 可以用来在两点之间进行 TCP/UDP 的连接,发送数据,也可以用来测试带宽。安装很简单:
# apt-get install netcat

假设监控机器叫 host-1,被测试机器叫 host-2,从 host-2 上传输数据到 host-1 上,在 host-1 上监听,小于 1024 端口需要 root 权限:
$ nc -l 1111 > /dev/null

在 host-2 上发送数据:
$ cat /dev/zero| nc host-1 1111

在 host-2 上开个 nload 就可以看出当前的带宽占用了。或者传一个指定大小的文件,通过 time 计数:
$ nc -l 1111 > /dev/null
$ time dd if=/dev/zero bs=16000 count=5000 | nc -v 220.181.111.85 1111

4. wget, curl, scp
这几个命令都可以用来测试两端的带宽:

$ wget -O=/dev/null http://url/download.tgz
$ curl -o /dev/null http://url/download.tgz
$ scp download.tgz [email protected]:

5. iperf
iperf 这个工具应该是属于全能型的,可以生成 TCP/UDP 流量来测试带宽、延时抖动以及丢包。其中抖动以及丢包可以通过 iperf UDP 实现而带宽可以通过 iperf TCP 实现。

不加 -u 参数就是使用 TCP,-s 在 server 段执行:
$ iperf -s
$ iperf  -c serverip  -d -i 1 -t 10

加上 -u 则使用 UDP 协议,这个在 VoIP 比较适用,此类场景对于抖动延时特别敏感,Jitter 代表延时变化,跟延时没多大关系。延时长不代表 jitter 高,这跟速度跟加速度关系一个原理:
$ iperf -s -u
$ iperf -u -c serverip -b 8M -i 1 -w 1M -t 10

20 个并行,每个进程 100k带宽,测试网络质量
iperf -u -c serverip -b 100k -i 1 -w 1M -t 30 -P20

默认情况下,iperf 只会测量从客户端到服务器端的带宽,使用 -d 参数可以测试双向带宽:
$ iperf -c serverip -d

-f 参数可以格式显示: bits(b), bytes(B), kilobits(k), kilobytes(K), megabits(m), megabytes(M), gigabits(g) or gigabytes(G).
$ iperf -c serverip -f b

通过 -w 参数修改 TCP win size(2-65535 bytes):
$ iperf -c serverip -w 2000
$ iperf -s -w 4000

还有几个常用的参数如下:
-p 修改 iperf 服务器的端口,默认为 5001,该参数客户端与服务器必须同时指定
-t 测试持续时间,默认为 10s
-I 指定两个带宽报告之间的间隔,默认 1s
一个综合的示例:
$ iperf -c 10.1.1.1 -p 12000 -t 20 -i 2
$ iperf -s -p 12000

更具体的用法请参考这里

要综合的评估一个网络的质量不是件容易的事,因为牵扯到的因素非常多,从机器的硬件到系统到中间链路再到对端的机器,有时候一根网线的质量就会影响到整个系统的稳定,之前我们就遇到过类似的情况,由于一根问题网线导致我们机器本身的速度上不去。另外除了上面介绍的一些方式,我们还需要经常通过 ifconfig 看看有没有 errors, overruns, collisions 等情况。还可以通过 traceroute 来跟踪某个 IP 的路由,如果这其中经过若干个运营商的 IP,网络质量可能就要大打折扣了,理想情况下,肯定是经过的运营商越少越好。