在 Linux 上模拟延迟和丢弃的数据包

新手上路,请多包涵

我想在 Linux 上模拟 UDPTCP 的数据包延迟和丢失,以测量应用程序的性能。有没有一种简单的方法可以做到这一点?

原文由 Alec 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 328
1 个回答

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 ± 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

实际的表(normal、pareto、paretonormal)作为 iproute2 编译的一部分生成并放置在 /usr/lib/tc 中;因此,可以根据实验数据做出自己的分布。

数据包丢失

随机数据包丢失在“tc”命令中以百分比指定。最小可能的非零值是:

2 -32 = 0.0000000232%

 # tc qdisc change dev eth0 root netem loss 0.1%

这会导致 110%(即千分之一)的数据包被随机丢弃。

也可以添加可选的相关性。这会导致随机数生成器的随机性降低,并可用于模拟数据包突发丢失。

 # tc qdisc change dev eth0 root netem loss 0.3% 25%

这将导致 0.3% 的数据包丢失,并且每个连续的概率取决于最后一个的四分之一。

概率n = 0.25 × 概率n-1 + 0.75 × 随机

请注意,如果您没有该接口的规则,则应使用 tc qdisc addtc qdisc change 如果您已有该接口的规则。尝试在没有规则的接口上使用 tc qdisc change 将给出错误 RTNETLINK answers: No such file or directory

原文由 ephemient 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题