本文主要介绍了可以模拟出多种复杂的互联网传输性能的工具——TC,及具体的模拟方法。
上篇文章回顾: Nginx请求处理流程你了解吗?
在日常生产环境中,如何判断网络运行状况是否正常是一个让大家比较耗神的一件事情,因为我们往往被某些不太友好的人以所谓的“网络问题”甩锅至此并开始了我们洗白的经历,今天给大家介绍一个分析网络状态的好帮手——TC。
说到TC,我们就不得不谈谈Netem(Network Emulator),Netem是Linux2.6及以上内核版本提供的一个网络模拟功能模块。该功能模块可可以用来在性能良好的局域网环境中,模拟出复杂的互联网传输性能。例如:低带宽、传输延迟、丢包等等等情况。
TC是Linu系统中的一个用户工具,全名为Traffic Control(流量控制)。TC可以用来控制Netem模块的工作模式,也就是说如果想使用Netem需要至少两个条件,一是内核中的Netem模块被启用,另一个是要对应的用户态工具TC,它们之间的关系你可以理解为netfilter框架和iptables的关系。
下面就让我们一起来看看TC的有用之处(其实TC有很多功能,我们今天只介绍模拟网络环境的用处),我们先了解一下如下参数代表的意义再开始实验。
Add:表示为指定网卡添加Netem配置。
Change:表示修改已经存在的Netem配置到新的值。
Replace:表示替换已经存在的Netem配置的值。
del:表示删除网卡上的Netem配置。
1、模拟延迟传输
如果你想在一个局域网里模拟远距离传输的延迟可以用这个方法,比如实际用户访问网站延迟为 51 ms,而你测试环境网络交互只需要 1ms,那么只要添加 50ms 额外延迟就行。
[root@tj1-vm-search020 ~]# tc qdisc add dev eth0 root netem delay 50ms
[root@tj1-vm-search019 ~]# ping tj1-vm-search020.kscn
PING tj1-vm-search020.kscn (10.38.167.17) 56(84) bytes of data.
64 bytes from tj1-vm-search020.kscn (10.38.167.17): icmp_seq=1 ttl=64 time=50.0 ms
64 bytes from tj1-vm-search020.kscn (10.38.167.17): icmp_seq=2 ttl=64 time=50.0 ms
64 bytes from tj1-vm-search020.kscn (10.38.167.17): icmp_seq=3 ttl=64 time=50.0 ms
64 bytes from tj1-vm-search020.kscn (10.38.167.17): icmp_seq=4 ttl=64 time=50.0 ms
^C
--- tj1-vm-search020.kscn ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 50.037/50.044/50.063/0.223 ms复制代码
如果在网络中看到非常稳定的时延,很可能是某个地方加了定时器,因为网络线路很复杂,传输过程一定会有变化。因此实际情况网络延迟一定会有变化的,Netem 也考虑到这一点,提供了额外的参数来控制延迟的时间分布。完整的参数列表为:
DELAY := delay TIME [ JITTER [ CORRELATION ]]]
[ distribution { uniform | normal | pareto | paretonormal } ]复制代码
除了延迟时间 TIME 之外,还有三个可选参数:
-
JITTER:抖动,增加一个随机时间长度,让延迟时间出现在某个范围。
-
CORRELATION:相关,下一个报文延迟时间和上一个报文的相关系数。
-
distribution:分布,延迟的分布模式。可以选择的值有 uniform、normal、pareto 和 paretonormal。
先说说 JITTER,如果设置为 20ms,那么报文延迟的时间在 50ms ± 20ms 之间,具体值随机选择:
[root@tj1-vm-search020 ~]# tc qdisc r