RasberryPiのtcで遅延発生器を作る

はじめに

RaspberryPiは安価なLinuxマシンである。 なにかうまい使い方を考えたかった。

RasPIにethernet2つ刺して、片方にさすと、片方に遅延が出るものを作りたい。

先にまとめ

CPUあんまり強くないので、使い物にならないかと思ったのですが、 今回は44Mbpsくらいまでの単なるdelayなどは問題なく使えました。 帯域制限などするとどうなるかはともかく、 一定のdelayいれたり、lossするならこれで十分っぽい。

構成

../_images/tc_raspi.png

Rasbianいれて、AppleのUSB-Etherアダプタをさしました。本当にそれだけ。

準備

sudo apt-get install bridge-utils
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo brctl addif br0 eth1
sudo ifconfig eth0 0.0.0.0 up
sudo ifconfig eth1 0.0.0.0 up
sudo ifconfig br0 up
sudo dhclient br0
/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual
auto eth1
allow-hotplug eth1
iface eth1 inet manual

auto br0
iface br0 inet static
 address 192.168.1.100
 netmask 255.255.255.0
 gateway 192.168.1.1
 bridge_ports eth0 eth1

試した

まずは本来のNWの状態

# 100ms ping
sudo ping -i.1 -c 100 www.hogetan.net
--- www.hogetan.net ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 7.988/8.733/11.030/0.443 ms
# 10ms ping
sudo ping -i.01 -c 100 www.hogetan.net
--- www.hogetan.net ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 7.949/8.945/12.754/0.990 ms

Raspi Bridge経由にした

変化なし。

sudo ping -i.1 -c 100 www.hogetan.net
--- www.hogetan.net ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 8.693/9.262/11.924/0.479 ms

sudo ping -i.01 -c 100 www.hogetan.net
--- www.hogetan.net ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 8.296/9.063/11.619/0.514 ms

down -> upに10msだけ

変化なし。

sudo tc qdisc add dev eth1 root netem delay 10ms
sudo ping -i.1 -c 100 www.hogetan.net
--- www.hogetan.net ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 18.415/18.968/19.927/0.287 ms

sudo ping -i.01 -c 100 www.hogetan.net
--- www.hogetan.net ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 18.398/19.044/20.919/0.409 ms

300msのディレイにした

あんまりかわらない。

sudo tc qdisc change dev eth1 root netem delay 300ms
sudo ping -i.01 -c 100 www.hogetan.net
--- www.hogetan.net ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 308.500/308.975/310.234/0.308 ms

CPU負荷かける

あんまりかわらない。

apt-get install pi
pi 1000000
sudo ping -i.01 -c 100 www.hogetan.net
--- www.hogetan.net ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 18.635/19.352/23.389/0.613 ms

10ms delay + loss 10%かける

普通。

sudo tc qdisc change dev eth1 root netem drop 10% delay 10ms
--- www.hogetan.net ping statistics ---
100 packets transmitted, 92 packets received, 8.0% packet loss
round-trip min/avg/max/stddev = 18.611/19.199/20.949/0.378 ms

スピードテスト

VDSLで本来、44Mbpsくらいなのですが、 delayいれない普通のBridgeにして44Mbpsでました。

まとめ

あくまで簡易的なネットワークエミュレータくらいならこれで十分。

応用

tc filterを知っていますか?ということで、特定のパケットだけ遅延をかけます。 この例では、片側のdst 4.3.2.1/32だけ100msの遅延を入れます。

tc qdisc add dev eth0 root netem delay 200ms 20ms distribution normal
tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \
 match ip dst 4.3.2.1/32 flowid 10:1
tc qdisc add dev eth1 root handle 1:0 netem delay 100ms
tc qdisc add dev eth1 parent 1:0 handle 10: tbf limit 15Kb buffer 10Kb/8 rate 1000Kbi