我想在Linux上模拟UDP和TCP的数据包延迟和丢失,以衡量应用程序的性能。有什么简单的方法吗?
当前回答
我自己还没有尝试过,但是这个页面有一个在Linux内置iptables IP过滤系统中运行的插件模块列表。其中一个模块称为“nth”,它允许您设置一个规则,该规则将丢弃可配置的数据包速率。至少这是个不错的开始。
其他回答
对于丢弃的包,我将简单地使用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”来获取更多信息。
netem利用已经内置在Linux和用户空间实用程序中的功能来模拟网络。这实际上就是马克的答案所指的,只不过名字不同罢了。
他们主页上的例子已经告诉了你如何实现你的要求:
Examples Emulating wide area network delays This is the simplest example, it just adds a fixed amount of delay to all packets going out of the local Ethernet. # tc qdisc add dev eth0 root netem delay 100ms Now a simple ping test to host on the local network should show an increase of 100 milliseconds. The delay is limited by the clock resolution of the kernel (Hz). On most 2.4 systems, the system clock runs at 100 Hz which allows delays in increments of 10 ms. On 2.6, the value is a configuration parameter from 1000 to 100 Hz. Later examples just change parameters without reloading the qdisc Real wide area networks show variability so it is possible to add random variation. # tc qdisc change dev eth0 root netem delay 100ms 10ms This causes the added delay to be 100 ± 10 ms. Network delay variation isn't purely random, so to emulate that there is a correlation value as well. # tc qdisc change dev eth0 root netem delay 100ms 10ms 25% This causes the added delay to be 100 ± 10 ms with the next random element depending 25% on the last one. This isn't true statistical correlation, but an approximation. Delay distribution Typically, the delay in a network is not uniform. It is more common to use a something like a normal distribution to describe the variation in delay. The netem discipline can take a table to specify a non-uniform distribution. # tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal The actual tables (normal, pareto, paretonormal) are generated as part of the iproute2 compilation and placed in /usr/lib/tc; so it is possible with some effort to make your own distribution based on experimental data. Packet loss Random packet loss is specified in the 'tc' command in percent. The smallest possible non-zero value is: 2−32 = 0.0000000232% # tc qdisc change dev eth0 root netem loss 0.1% This causes 1/10th of a percent (i.e. 1 out of 1000) packets to be randomly dropped. An optional correlation may also be added. This causes the random number generator to be less random and can be used to emulate packet burst losses. # tc qdisc change dev eth0 root netem loss 0.3% 25% This will cause 0.3% of packets to be lost, and each successive probability depends by a quarter on the last one. Probn = 0.25 × Probn-1 + 0.75 × Random
注意,如果你对该接口没有规则,你应该使用tc qdisc add;如果你已经对该接口有规则,你应该使用tc qdisc change。尝试在没有规则的接口上使用tc qdisc change将给出错误RTNETLINK答案:no such file or directory。
科学界最常用的工具之一就是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
这里有更多细节。
破坏者是一种易于使用的网络故障注入工具。它可以模拟:
网络总分区 远程服务关闭(没有监听预期的端口) 延迟 包丢失 -TCP连接超时(当两个系统被有状态防火墙隔开时经常发生)
我自己还没有尝试过,但是这个页面有一个在Linux内置iptables IP过滤系统中运行的插件模块列表。其中一个模块称为“nth”,它允许您设置一个规则,该规则将丢弃可配置的数据包速率。至少这是个不错的开始。
推荐文章
- 在tmux中保持窗口名称固定
- 如何生成一个核心转储在Linux上的分段错误?
- 在Python中如何在Linux和Windows中使用“/”(目录分隔符)?
- 如何在Apache服务器上自动将HTTP重定向到HTTPS ?
- 如何限制从grep返回的结果的数量?
- 将值从管道读入shell变量
- 以相对于当前目录的路径递归地在Linux CLI中列出文件
- 如何使用xargs复制名称中有空格和引号的文件?
- 在makefile中抑制命令调用的回声?
- 在套接字编程中AF_INET和PF_INET的区别是什么?
- Chmod递归
- 任何方式退出bash脚本,但不退出终端
- 如何查看按实际内存使用情况排序的顶级进程?
- 如何将多行输出连接到一行?
- 使用grep搜索包含点的字符串