我想在Linux上模拟UDP
和TCP
数据包的延迟和丢失,以衡量应用程序的性能。是否有一种简单的方法来实现这个目标?
我想在Linux上模拟UDP
和TCP
数据包的延迟和丢失,以衡量应用程序的性能。是否有一种简单的方法来实现这个目标?
netem 利用已经内置在Linux和用户空间工具中的功能来模拟网络。这实际上就是Mark答案所指的内容,只是使用了另一个名称。
他们网站上的示例已经展示了如何实现您所要求的内容:
示例
仿真广域网延迟
这是最简单的示例,它只是对所有从本地以太网出去的数据包添加了固定数量的延迟。
# tc qdisc add dev eth0 root netem delay 100ms
现在,对本地网络上的主机进行简单的ping测试应该会显示100毫秒的增加。延迟受内核时钟分辨率(Hz)的限制。在大多数2.4系统中,系统时钟运行在100 Hz,这允许以10ms的增量产生延迟。在2.6中,该值是一个配置参数,范围从1000到100 Hz。
后面的例子只是改变参数而不重新加载qdisc。
真实的广域网展示了可变性,因此可以添加随机变化。
# tc qdisc change dev eth0 root netem delay 100ms 10ms
这会导致额外的延迟为100±10ms。网络延迟变化并非纯随机,为了模拟这种情况,还有一个相关值。
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
这将导致添加的延迟为100±10毫秒,下一个随机元素取决于上一个元素的25%。这并不是真正的统计相关性,而是一种近似。
通常,网络延迟不是均匀的。更常见的做法是使用类似正态分布的东西来描述延迟的变化。netem disipline可以采用表格来指定非均匀分布。
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
实际的表格(normal、pareto、paretonormal)是作为iproute2编译的一部分生成并放置在/usr/lib/tc中的;因此,可以通过一些努力基于实验数据制作自己的发行版。
在“tc”命令中以百分比指定随机数据包丢失。最小可能的非零值为:
2−32 = 0.0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
这会导致随机丢弃1/10个百分点的数据包(即1000个数据包中有1个被丢弃)。
还可以添加可选关联。这会使随机数生成器不太随机,并可用于模拟数据包突发性丢失。
# tc qdisc change dev eth0 root netem loss 0.3% 25%
这会导致 0.3% 的数据包丢失,并且每个连续的概率都依赖于上一个概率的四分之一。
Probn = 0.25 × Probn-1 + 0.75 × Random
请注意,如果您在该接口上没有规则,则应使用tc qdisc add
,如果您已经为该接口设置了规则,则应使用tc qdisc change
。试图在没有规则的接口上使用tc qdisc change
将会出现错误RTNETLINK answers: No such file or directory
。
tc -p qdisc ls dev eth0
将列出当前定义的规则,而tc qdisc del dev eth0 root
将删除它们。 - Quamis对于丢弃的数据包,我会简单地使用iptables和统计模块。
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
以上代码将有1%的概率丢弃一个入站数据包。请注意,如果超过0.14,大多数TCP连接很可能会完全停顿。
使用-D
命令撤销:
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
查看 man iptables 命令并搜索“statistic”以获取更多信息。
DROP
命令可能会让send()
操作返回EPERM
,而不是像本应该做的那样丢弃数据包。 - Fake Nameiptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
- jcalfee314iptables(8)有一个统计匹配模块,可以用来匹配每第n个数据包。要丢弃此数据包,只需添加-j DROP。