我想在Linux上模拟UDP和TCP的包延迟和丢失,以衡量应用程序的性能。有什么简单的方法吗?
UDP
TCP
我自己没有尝试过,但是这个页面有一个在Linux内置iptables IP过滤系统中运行的插件模块列表。其中一个模块叫做"nth",它允许您设置一个规则,该规则将丢弃一个可配置的数据包速率。至少这是个不错的开始。
Iptables(8)有一个统计匹配模块,可以用来匹配每n个数据包。要删除这个包,只需添加- j下降。
没多大利用已经内置在Linux和用户空间实用程序中的功能来模拟网络。这实际上就是马克的答案所指的,只不过名字不同罢了。
他们的主页上的例子已经展示了如何实现你所要求的:
例子 模拟广域网时延 这是一个最简单的例子,它只是给所有从本地以太网发出的数据包增加了一个固定的延迟。 # tc qdisc add dev eth0 root netem delay 100ms 现在,对本地网络上的主机进行一个简单的ping测试,应该显示增加了100毫秒。延迟受内核的时钟分辨率(Hz)的限制。在大多数2.4系统上,系统时钟运行在100 Hz,允许延迟增加10 ms。2.6版本为1000 ~ 100hz的配置参数。 后面的例子只是改变参数而不重新加载qdisc 真正的广域网具有可变性,因此可以添加随机变化。 # tc qdisc change dev eth0 root netem delay 100ms 10ms 这导致增加的延迟为100±10毫秒。网络延迟的变化并不是完全随机的,所以为了模拟它,还需要一个相关值。 # tc qdisc change dev eth0 root netem delay 100ms 10ms 25% 这导致增加的延迟为100±10毫秒,下一个随机元素取决于上一个元素的25%。这不是真正的统计相关性,而是一个近似值。 延迟分布 通常,网络中的延迟是不均匀的。更常见的是使用一个类似正态分布的东西来描述延迟的变化。netem规程可以使用一个表来指定非均匀分布。 # tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal 实际的表(normal, pareto, paretonormal)是作为iproute2编译的一部分生成的,并放在/usr/lib/tc中;所以我们可以根据实验数据做出自己的分布。 包丢失 在'tc'命令中以百分比为单位指定随机丢包。最小的非零值为: 2__abc0 = 0.0000000232% # tc qdisc change dev eth0 root netem loss 0.1% 这会导致千分之一(即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 dev eth0 root netem delay 100ms
现在,对本地网络上的主机进行一个简单的ping测试,应该显示增加了100毫秒。延迟受内核的时钟分辨率(Hz)的限制。在大多数2.4系统上,系统时钟运行在100 Hz,允许延迟增加10 ms。2.6版本为1000 ~ 100hz的配置参数。
后面的例子只是改变参数而不重新加载qdisc
真正的广域网具有可变性,因此可以添加随机变化。
# tc qdisc change dev eth0 root netem delay 100ms 10ms
这导致增加的延迟为100±10毫秒。网络延迟的变化并不是完全随机的,所以为了模拟它,还需要一个相关值。
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
这导致增加的延迟为100±10毫秒,下一个随机元素取决于上一个元素的25%。这不是真正的统计相关性,而是一个近似值。
通常,网络中的延迟是不均匀的。更常见的是使用一个类似正态分布的东西来描述延迟的变化。netem规程可以使用一个表来指定非均匀分布。
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
实际的表(normal, pareto, paretonormal)是作为iproute2编译的一部分生成的,并放在/usr/lib/tc中;所以我们可以根据实验数据做出自己的分布。
在'tc'命令中以百分比为单位指定随机丢包。最小的非零值为:
2__abc0 = 0.0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
这会导致千分之一(即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 qdisc add
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连接很可能会完全失速。
使用-D撤销:
-D
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
看看man iptables,搜索“statistic"获取更多信息。
破坏者是一个易于使用的网络故障注入工具。它可以模拟:
网络总分区 远程服务关闭(没有监听预期的端口) 延迟 <李>包损失 -TCP连接超时(当两个系统被一个有状态防火墙隔开时经常发生)
在科学界最常用的工具之一是DummyNet。一旦你安装了ipfw内核模块,为了在2台机器之间引入50ms的传播延迟,只需运行这些命令:
ipfw
./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
在这里更多细节。