20250712: 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