我想模拟数据包延迟和丢失的UDP
,并TCP
在Linux上衡量一个应用程序的性能。有没有简单的方法可以做到这一点?
我想模拟数据包延迟和丢失的UDP
,并TCP
在Linux上衡量一个应用程序的性能。有没有简单的方法可以做到这一点?
Answers:
netem利用Linux和用户空间实用程序中已内置的功能来模拟网络。这实际上是Mark的答案所指的另一种名称。
他们主页上的示例已经显示了如何实现您所要求的:
例子
模拟广域网延迟
这是最简单的示例,它只是向从本地以太网传出的所有数据包增加了固定的延迟量。
# tc qdisc add dev eth0 root netem delay 100ms
现在,对本地网络上的主机进行的简单ping测试应该显示增加了100毫秒。延迟受内核的时钟分辨率(Hz)限制。在大多数2.4系统上,系统时钟以100 Hz运行,这允许以10 ms为增量的延迟。在2.6上,该值是1000到100 Hz之间的配置参数。
后面的示例仅更改参数而无需重新加载qdisc
实际的广域网显示出可变性,因此可以添加随机变化。
# tc qdisc change dev eth0 root netem delay 100ms 10ms
这导致增加的延迟为100±10 ms。网络延迟变化并非纯粹是随机的,因此可以模拟存在一个相关值。
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
这导致添加的延迟为100±10 ms,而下一个随机元素取决于最后一个元素的25%。这不是真正的统计相关性,而是近似值。
延迟分配
通常,网络中的延迟不是均匀的。更常见的是使用正态分布之类的东西来描述延迟的变化。netem学科可以使用一个表来指定非均匀分布。
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
实际的表(普通表,pareto,paretonormal)是作为iproute2编译的一部分生成的,并放在/ usr / lib / tc中。因此可以根据实验数据做出自己的分配。
数据包丢失
在'tc'命令中以百分比指定随机数据包丢失。最小的非零值是:
2 −32 = 0.0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
这导致百分之一的十分之一(即千分之一)的数据包被随机丢弃。
也可以添加可选的相关性。这导致随机数生成器的随机性降低,并可用于模拟数据包突发丢失。
# tc qdisc change dev eth0 root netem loss 0.3% 25%
这将导致0.3%的数据包丢失,并且每个连续概率取决于最后一个概率的四分之一。
概率n = 0.25×概率n-1 + 0.75×随机
请注意,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
并将其删除
对于丢弃的数据包,我将只使用iptables和statistic模块。
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
上面将丢弃传入数据包的概率为1%。请注意,任何高于0.14的值和大多数tcp连接都很可能会完全停止。
查看man iptables并搜索“统计”以获取更多信息。
DROP
在出站连接上相当可笑地导致send()
操作返回EPERM
,而不是仅仅丢弃数据包(应该这样)。
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
我的一位同事使用tc执行此操作。有关更多信息,请参考手册页。您可以在此处查看其用法示例。
您可以尝试http://snad.ncsl.nist.gov/nistnet/ 这是一个相当老的NIST项目(最新发布的2005年版本),但是对我有用。