RasberryPiのtcで遅延発生器を作る ********************************** はじめに ================= RaspberryPiは安価なLinuxマシンである。 なにかうまい使い方を考えたかった。 RasPIにethernet2つ刺して、片方にさすと、片方に遅延が出るものを作りたい。 先にまとめ ============== CPUあんまり強くないので、使い物にならないかと思ったのですが、 今回は44Mbpsくらいまでの単なるdelayなどは問題なく使えました。 帯域制限などするとどうなるかはともかく、 一定のdelayいれたり、lossするならこれで十分っぽい。 構成 ========== .. image:: Img/tc_raspi.png :width: 50% 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