C/C++

unix domain socketよりもlocal宛のtcp socketの方が速いこともある

こんばんは!
毎日投稿するぞって思ってるんですけどなかなか難しいですね。3日ぶりの更新となってしまいました(-_-;)

さて、今回は前回(unix domainのソケット通信)前々回(ソケット通信)の続きとしてUNIXソケットとTCPソケットの性能比較を行っていきたいと思って書き始めたんですよ、で、いざ性能測定してみたら自分の信じてた常識が崩壊して途方に暮れながら記事を書いている今日この頃です。

流石に長ったらしい検証コードの後ろに結果書くのは見にくいかと思ったので先に結果から説明しますと、タイトルにも書いたんですけど、ループバックアドレス(127.0.0.1)宛のTCPソケット(IPv4)の方がUNIXドメインソケットの方が速かったんですよ。
今までプロセス間通信としてUNIXドメインソケットを愛用してきただけに衝撃的でした。

以下結果です。

データ[KiB]
(各100万回)
TCP[sec]UNIX[sec]
11.01.33
41.562.17
164.206.91

一応各10回ずつの測定で、docker上のCentOS7での結果です。テストコードはboost等のライブラリは使用していない生のCで書いてます。

UNIXドメインソケットの方が速いと今まで信じてきていたので本当に衝撃の結果でした(2回目)。


以下、テストに使用したソースコードです。

サーバ側ソース

クライアント側ソース

本当にTCPソケットの方が速いのか、docker上だからなのか、テストコードがおかしいのか…等を含め追加で調査したいと思います。
なにかご存知の方がいらしたら教えてください。。。

午前二時のテンションで検証なんてするもんじゃないな…そうだ踏切でも行ってこよう(錯乱)

コメント

  1. すみません、2018年の記事に 2024年の世界からアクセスします。

    プロセスって、起動から一定時間が経つとOSから「こいつ長時間かかるし後回し」ってされる可能性がありませんか。

    クライアント側ソース:
    プロセス起動 → TCP の試験 → UnixSock の試験

    だと、起動からの経過時間によってOSのプロセス スケジューリングアルゴリズムの影響を受けることはないでしょうか。

    プロセス起動 → TCP の試験
    プロセス起動 → UnixSock の試験

    という実行方法だと、結果が変わるかもしれませんね。

タイトルとURLをコピーしました