🚅
同一ホスト上のDockerコンテナ間とホスト-コンテナ間の通信はどちらが早いのだろうか
なんとなく気になって確認したのでメモ
とりあえずtracerouteしてみた感じどっちも間に何もなかったので
あんまり差は出なそうと思った
コンテナ-コンテナ間
# traceroute -U 172.17.0.2
traceroute to 172.17.0.2 (172.17.0.2), 30 hops max, 60 byte packets
1 172.17.0.2 (172.17.0.2) 0.065 ms 0.009 ms 0.008 ms
ホスト-コンテナ間
$ traceroute -U 172.17.0.2
traceroute to 172.17.0.2 (172.17.0.2), 30 hops max, 60 byte packets
1 172.17.0.2 (172.17.0.2) 0.054 ms 0.007 ms 0.005 ms
手っ取り早く計測したかったのでUDPでポート開いたコンテナに別のコンテナ及びホストOSから/dev/zeroを突っ込んでどれくらい速さに差が出るのかで比較する
という完全に我流の測定方法で比較してみた
こんなやり方じゃだめだよ的な指摘があればコメントお願いします。
試したDockerのバージョン
$ docker version
Client:
Version: 20.10.2
API version: 1.41
Go version: go1.13.8
Git commit: 20.10.2-0ubuntu1~20.04.2
Built: Tue Mar 30 21:24:57 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server:
Engine:
Version: 20.10.2
API version: 1.41 (minimum version 1.12)
Go version: go1.13.8
Git commit: 20.10.2-0ubuntu1~20.04.2
Built: Mon Mar 29 19:10:09 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.3.3-0ubuntu2.3
GitCommit:
runc:
Version: spec: 1.0.2-dev
GitCommit:
docker-init:
Version: 0.19.0
GitCommit:
コンテナ-コンテナ間
コンテナを2個立ち上げて調査に必要なパッケージを入れる
$ docker run -it --rm ubuntu bash
root@0999f600f3b0:/# apt update -y && apt install -y pv netcat iproute2
両方のコンテナのIPを調べる
root@82de58e15a8c:/# ip a show eth0
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@0999f600f3b0:/# ip a show eth0
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
172.17.0.2にて速度測定調査用のポートをOPEN
# nc -lu 172.17.0.2 8080 | pv -Ss 50G -ptebar > /dev/null
172.17.0.3から/dev/zeroを172.17.0.2に転送する
root@0999f600f3b0:/# nc -u 172.17.0.2 8080 < /dev/zero
すると172.17.0.2が50GB分のデータを受信した時点で終わります
(ポート開いてからデータ送信するまでの時間が0bps扱いになるからすばやく一連の作業をこなしました)
root@82de58e15a8c:/# nc -lu 172.17.0.2 8080 | pv -Ss 50G -ptebar > /dev/null
50.0GiB 0:01:30 [ 564MiB/s] [ 564MiB/s] [==================================================================================================================================>] 100%
コンテナーコンテナ間は564MiB/sでした
ホストーコンテナ間
やることは同じです172.17.0.3でやったことをホストOSでやれば172.17.0.2で速度が表示されます。
$ nc -lu 172.17.0.2 8080 | pv -Ss 50G -ptebar > /dev/null
50.0GiB 0:01:08 [ 742MiB/s] [ 742MiB/s] [==================================================================================================================================>] 100%
ホストーコンテナ間は742MiB/sでした
結論
何度かやったけど数M程度の誤差でした。
この事から何が言えるかって。。。?🤔
どっちかからでっかいデータ流す必要が出たときはホストOSからコンテナに流すほうが1.3倍くらい早いのでオススメ?(今までそんな事態になったこと無。。。🤐)
以上、現場からお届けしました。
P.S.
完全に興味本位でやった内容なので誰の役にも立たない記事になってる気がする🤣
Discussion