我想模拟数据包延迟和丢失的UDP
,并TCP
在Linux上衡量一个应用程序的性能.有一个简单的方法吗?
netem利用已经内置在Linux和用户空间实用程序中的功能来模拟网络.这实际上是马克的答案所指的不同名称.
他们主页上的示例已经显示了如何实现您的要求:
例子
模拟广域网延迟
这是最简单的示例,它只是为从本地以太网发出的所有数据包添加了固定数量的延迟.
# 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±10ms.网络延迟变化不是纯粹随机的,因此要模拟存在相关值.
# 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实际表(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%的数据包丢失,并且每个连续概率取决于最后一个数据包的四分之一.
Prob n = 0.25×Prob n-1 + 0.75×随机
请注意,tc qdisc add
如果您没有该接口的规则,或者tc qdisc change
您已经拥有该接口的规则,则应该使用.尝试tc qdisc change
在没有规则的接口上使用会产生错误RTNETLINK answers: No such file or directory
.
对于丢弃的数据包,我只需使用iptables和统计模块.
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
以上将以1%的概率丢弃传入的数据包.小心,大约0.14以上的任何东西tcp连接都很可能完全停止.
看看man iptables并搜索"statistic"以获取更多信息.
我的一位同事使用tc来做到这一点.有关更多信息,请参见手册页.您可以在此处查看其用法示例.