ども、初老丸です。

tl;dr

Linux において tc コマンド(Traffic Control)使ってネットワーク遅延やパケットロスを疑似的に発生させることが出来るとのこと。今まで tc コマンドの存在すら知らなかったペーペーで恐縮だが、参考サイトをまねて遅延やパケットロスを発生させてみたい。

メモ

参考

man tc

以下の環境で試す。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"

ひとまず man してみる。

TC(8)                                                                                                Linux                                                                                                TC(8)

NAME
       tc - show / manipulate traffic control settings

SYNOPSIS
       tc qdisc [ add | change | replace | link | delete ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]

(略)

DESCRIPTION
       Tc is used to configure Traffic Control in the Linux kernel. Traffic Control consists of the following:

どうやら Linux Kernel の一機能を利用して遅延やパケットロスを発生させるようだ。

ネットワーク遅延を発生させてみる

  • コマンドオプション

man tc より抜粋。

tc qdisc [ add | change | replace | link | delete ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]
  • 100ms の遅延を発生させる
sudo tc qdisc add dev eth0 root netem delay 100ms

ping で確認。

$ ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=63 time=101 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=63 time=100 ms
64 bytes from 10.0.2.2: icmp_seq=3 ttl=63 time=100 ms

--- 10.0.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 100.278/100.709/101.236/0.540 ms
  • 200ms の遅延に変更する
sudo tc qdisc change dev eth0 root netem delay 200ms

ping で確認。

$ ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=63 time=201 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=63 time=200 ms
64 bytes from 10.0.2.2: icmp_seq=3 ttl=63 time=202 ms

--- 10.0.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 200.508/201.525/202.364/0.851 ms
  • 遅延設定を確認する
sudo tc qdisc show dev eth0

実行結果を確認。

$ tc qdisc show dev eth0
qdisc netem 8001: root refcnt 2 limit 1000 delay 200.0ms

ping で確認。

$ ping -c 3 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=63 time=0.205 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=63 time=0.234 ms
64 bytes from 10.0.2.2: icmp_seq=3 ttl=63 time=0.227 ms

--- 10.0.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.205/0.222/0.234/0.012 ms
  • 遅延設定を削除する
sudo tc qdisc del dev eth0 root

で、気になるのがコマンドオプションの qdisc について man ページの抜粋。

QDISCS
       qdisc  is  short for 'queueing discipline' and it is elementary to understanding traffic control. Whenever the kernel needs to send a packet to an interface, it is enqueued to the qdisc configured for
       that interface. Immediately afterwards, the kernel tries to get as many packets as possible from the qdisc, for giving them to the network adaptor driver.

       A simple QDISC is the 'pfifo' one, which does no processing at all and is a pure First In, First Out queue. It does however store traffic when the network interface can't handle it momentarily.

qdisc についてはこちらの記事がとても参考になった。抜粋させて頂くと…

Traffic Controlは送信したいパケットをschedulerと呼ばれるものに通すことで行われます。schedulerはキューイング規則(Queueing discipline: qdisc)とも呼ばれ、パケットを一時的に格納し、順番を並べ替えたり、遅延させたり、破棄したりすることができます。以下qdiscと呼びます。

tc コマンドはパケットを qdisc に放り込むことで遅延やパケットロス等を実現するようだ。

パケットロスを発生させる

  • パケットロスを発生させてみる
sudo tc qdisc add dev eth0 root netem loss 3%

ping で確認。

$ ping 10.0.2.2 -c 30
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=63 time=0.128 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=63 time=0.227 ms

(略)

64 bytes from 10.0.2.2: icmp_seq=29 ttl=63 time=0.245 ms
64 bytes from 10.0.2.2: icmp_seq=30 ttl=63 time=0.454 ms

--- 10.0.2.2 ping statistics ---
30 packets transmitted, 29 received, 3% packet loss, time 29001ms
rtt min/avg/max/mdev = 0.128/0.325/0.905/0.160 ms

以上

メモでした。

元記事はこちら

tc コマンドでネットワーク遅延やパケットロスを疑似的に発生させるメモ