同一マシン上でプロセス間通信するときに、Unixドメインソケットと127.0.0.1のTCPソケットのどちらの方がパフォーマンスがいいのか調べています。
こちらのstack overflowの回答によるとUnixドメインソケットの方がレイテンシ、スループットともに断然上ということで、TCPが持っている複雑なフロー制御などの仕組みを考えるとそれも納得がいきます。
しかし上記回答の中にもあるこちらのベンチマークを試してみたところ、仮想環境上ではそれが逆転する場合があるという結果になりました。
ベンチマーク実行方法
git clone https://github.com/rigtorp/ipc-bench.git cd ipc-bench make make run
結果
環境 | TCP | Unix |
---|---|---|
EC2 (t2.micro) | 1536 | 939 |
ConoHa VPS | 750 | 507 |
Windows + VirtualBox | n | 3 * n |
実機 (EC2 i3.metal) | 241 | 924 |
Mac実機 | 91 | 389 |
- TCPは実行結果に表示される
tcp_thr
のaverage throughput (Mb/s)
の値 - Unixは実行結果に表示される
unix_thr
のaverage throughput (Mb/s)
の値 - t2.micro, ConoHaではTCPの方がスループットが大きく、それ以外では逆となっています
- 最後の「Mac実機」以外はLinux。カーネルのバージョンは同一ではないです…
- Windows + VirtualBox上では数値を記録しそこねたのですが、Unixの方が3倍の値でした。
- したがって「全ての仮想環境で逆転する」というわけではありませんでした。
質問
どうして環境によってこのような逆転が起きるのか疑問に思っています。
「カーネルの実装からしてこういう理由だろう」といったヒントだけでもいただけますでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/22 03:09