在Linux上模拟延迟和丢弃的数据包
我想在Linux上模拟UDP
和TCP
数据包延迟和丢失来衡量应用程序的性能。 有一个简单的方法来做到这一点?
netem利用已经内置于Linux和用户空间实用程序中的function来模拟networking。 这实际上是马克的答案所指的,用不同的名字。
在他们的主页上的例子已经显示了你可以如何实现你所要求的:
例子
模拟广域网延迟
这是最简单的例子,它只是增加了一个固定数量的延迟到本地以太网的所有数据包。
# tc qdisc add dev eth0 root netem delay 100ms
现在一个简单的pingtesting在本地networking上应该显示增加100毫秒。 延迟受内核时钟分辨率(Hz)的限制。 在大多数2.4系统中,系统时钟以100Hz运行,允许延迟10ms。 在2.6上,该值是一个从1000到100 Hz的configuration参数。
后面的例子只是改变参数而不重载qdisc
真正的广域网显示变化,所以可以添加随机变化。
# tc qdisc change dev eth0 root netem delay 100ms 10ms
这导致增加的延迟为100±10毫秒。 networking延迟的变化不是纯粹的随机的,所以要模拟一个相关值。
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
这导致增加的延迟为100±10毫秒,下一个随机元素取决于最后一个的25%。 这不是真正的统计相关性,而是一个近似值。
延迟分配
通常,networking中的延迟是不统一的。 使用类似正态分布的东西来描述延迟的变化更为常见。 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%
这导致百分之十分之一(即1000个中的一个)被随机丢弃。
可选的关联也可以被添加。 这使得随机数发生器的随机性较小,可以用来模拟分组丢失。
# tc qdisc change dev eth0 root netem loss 0.3% 25%
这将导致0.3%的数据包丢失,每个连续的概率取决于最后一个数据包的四分之一。
Prob n = 0.25×Prob n-1 + 0.75×Random
请注意 ,如果您没有该接口的规则,那么应该使用tc qdisc add
,或者如果您已经有该接口的规则,那么tc qdisc change
。 试图在没有规则的接口上使用tc qdisc change
会导致RTNETLINK answers: No such file or directory
错误的RTNETLINK answers: No such file or directory
。
对于丢弃的数据包,我只需使用iptables和统计模块 。
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
以上将以1%的概率丢弃传入的数据包。 小心,大约0.14以上的东西,你大多数TCP连接将很可能完全停止。
看看男人iptables和search“统计”的更多信息。
我的一个同事使用tc来做到这一点。 有关更多信息,请参阅手册页。 你可以在这里看到它的用法的一个例子。
iptables(8)有一个统计模块,可以用来匹配每个第n个数据包。 要丢弃这个数据包,只需追加-j DROP即可 。
关于networking物理仿真的这个教程在 示例代码中包含一个C ++类,用于模拟UDP连接中的延迟和数据包丢失,可能是一个指导。 请参阅可下载源代码的Connection.h文件中的Connection类的公共延迟和packetLossvariables。
还没有自己尝试过,但是这个页面有一个插件模块列表,可以在Linux内置的iptables IP过滤系统中运行。 其中一个模块被称为“nth”,并允许您设置一个规则,将丢弃一个可configuration的数据包速率。 至less可以成为一个很好的起点。
DummyNet是科学界最常用的工具之一。 一旦你安装了ipfw
内核模块,为了在两台机器之间引入50ms传播延迟,只需运行这些命令:
./ipfw pipe 1 config delay 50ms ./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2
为了还要引入50%的数据包丢失,您必须运行:
./ipfw pipe 1 config plr 0.5
这里有更多细节。
一个易于使用的networking故障注入工具是Saboteur 。 它可以模拟:
- 总networking分区
- 远程服务死了(不听预期的端口)
- 延误
- 数据包丢失-TCP连接超时(当两个系统由状态防火墙分隔时,经常发生)