Comcast
在诸如网络分区和实例终止这样的硬故障下测试分布式系统是至关重要的,但我们在灾难性较小的条件下测试它们也很重要,因为这是它们最常遇到的情况。Comcast是一个用来模拟常见网络问题的工具,如延迟、带宽限制和丢弃/重新排序/损坏的数据包。
它通过以可移植(ish)的方式包装一些系统工具来工作。在BSD-derived系统(如OSX)上,我们使用ipfw
和pfctl
等工具注入故障。在Linux上,我们使用iptables
和tc
。Comcast只是这些控件的一层薄薄的包装。wipfw
甚至原生网络堆栈都可以支持Windows,但这还没有在Comcast中实现,可能会在以后实现。
Installation
$ go get github.com/tylertreat/comcast
Usage
在Linux上,Comcast支持几个选项:设备、延迟、目标/默认带宽、数据包丢失、协议和端口号。
$ comcast --device=eth0 --latency=250 --target-bw=1000 --default-bw=1000000 --packet-loss=10% --target-addr=8.8.8.8,10.0.0.0/24 --target-proto=tcp,udp,icmp --target-port=80,22,1000:2000
在OSX上,Comcast将检查pfctl
支持(从Yosemite开始),它支持与上面相同的选项。如果pfctl
不可用,它将使用ipfw
,它支持设备、延迟、目标带宽和packet-loss选项。
在BSD上(使用ipfw
),Comcast目前只支持:设备、延迟、目标带宽和数据包丢失。
$ comcast --device=eth0 --latency=250 --target-bw=1000 --packet-loss=10%
这将增加250毫秒的延迟,将带宽限制在1Mbps,并使用指定端口号上的指定协议将10%的数据包丢弃到目标(在Linux上)目标地址(慢速通道)。指定的默认带宽将应用于所有出口流量(快车道)。要关闭此功能,请运行以下命令:
$ comcast --stop
默认情况下,comcast将确定要执行的系统命令,将它们记录到stdout,然后执行它们。--dry-run
标志将跳过执行。
我不相信你,这个代码很烂,我讨厌围棋,等等。
如果您不喜欢运行为您执行shell命令的代码(尽管它是开源的,所以您可以读取它并更改代码)或想要finer-grained控件,那么可以直接运行它们。阅读关于这些东西的手册页了解更多细节。
Linux
在Linux上,可以使用iptables
来丢弃传入和传出的数据包。
$ iptables -A INPUT -m statistic --mode random --probability 0.1 -j DROP
$ iptables -A OUTPUT -m statistic --mode random --probability 0.1 -j DROP
或者,您可以使用tc
,它支持一些附加选项。
$ tc qdisc add dev eth0 root netem delay 50ms 20ms distribution normal
$ tc qdisc change dev eth0 root netem reorder 0.02 duplicate 0.05 corrupt 0.01
To reset:
$ tc qdisc del dev eth0 root netem
BSD/OSX
要在BSD-derived系统中塑造流量,请创建ipfw
管道并对其进行配置。您可以为任何特定主机或网络分别控制传入和传出流量。
$ ipfw add 1 pipe 1 ip from me to any
$ ipfw add 2 pipe 1 ip from any to me
$ ipfw pipe 1 config delay 500ms bw 1Mbit/s plr 0.1
To reset:
$ ipfw delete 1
注意:ipfw
在OSX Yosemite中被删除,取而代之的是pfctl
。
Network Condition Profiles
下面是一个网络条件列表,其中包含可以插入Comcast的值。请再加上你可能遇到的。
Name | Latency | Bandwidth | Packet-loss |
---|---|---|---|
GPRS (good) | 500 | 50 | 2 |
EDGE (good) | 300 | 250 | 1.5 |
3G/HSDPA (good) | 250 | 750 | 1.5 |
DIAL-UP (good) | 185 | 40 | 2 |
DSL (poor) | 70 | 2000 | 2 |
DSL (good) | 40 | 8000 | 0.5 |
WIFI (good) | 40 | 30000 | 0.2 |
Satellite | 1500 | - | 0.2 |