サーバー内部のローカルホスト内で、例えばphpからMySQLへ接続する際、TCP接続よりもUNIXドメインソケットで接続したほうが通信コストが低いと聞きましたが、(使用するアプリケーションにもよると思いますが)具体的にどの程度負荷が下がるものなのでしょうか?


また、UNIXドメインソケットはソケットファイル(hoge.sock)を介して通信されるとのことで、これは単純に考えてソケットファイルをtmpfsなどメモリ上に移せば更にパフォーマンスが上がるものなのでしょうか?

もしかしたら的外れな質問かも知れませんが、よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/01/26 13:42:28
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント50pt

実際にベンチマークテストをしたレポートを見つけました。

http://osnet.cs.binghamton.edu/publications/TR-20070820.pdf
(PDF ファイルです)

4ページの英文のレポートですが、3ページ目に出ているグラフがわかりやすいです。

このレポートでは UNIX Domain ソケット、パイプ、TCP の3通りのケースで、Figure 1. ではデータサイズを横軸に、Figure 2. ではバッファサイズを横軸にして、それぞれのケースでスループットを計測した結果がグラフになっています。これを見ると、数倍以上のスループットの差があるようです。

(使用するアプリケーションにもよると思いますが)

一般的には、UNIX ドメインソケットの方がパフォーマンスが良い、というのは変わらないと思いますが、Solaris 上の UNIX ドメインソケットは TCP より遅い、という噂はあります。私自身は体感したことも無いし、確たる証拠をつかんでいる訳じゃないのですが、その噂が本当かどうかは、個人的には疑問があります。

これは単純に考えてソケットファイルをtmpfsなどメモリ上に移せば更にパフォーマンスが上がるものなのでしょうか?

ソケットファイルは、実際にディスク上で読み書きするファイルではありません。デバイスファイルと同様、あくまでもアクセスするための「パス名」がそこに存在するだけです。

なので、tmpfs 上で作っても、パフォーマンスは上がりません。厳密には、最初につなぐときにだけ tmpfs の方が有利な可能性がありますが、実感はできないでしょう。

id:xxmasaxx

やはりUNIXドメインソケットのほうが速いのですね。
tmpfsでも変わらないということで勘違いしていました。回答有り難うございます。

2012/01/26 13:20:32
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント50pt

こんなのがありました。
http://www.omakase.org/perl/starmanreverseproxyab.html

Perl で書かれた Webサーバ Starman へ、リバースプロキシとして幾つかの httpd から
つないだときのスループットを ab で計測した結果です。

その中に nginx で、TCP/IP と Unix domain でつなげたときの結果があります。
1秒間のスループットが、以下のような感じ。

接続方法リクエスト数
TCP/IP242
Unix domain271


それほど、差があるわけではありませんね。
因みに、ダントツは apache の keepalive が効いているときの 402 です。

TCP接続よりもUNIXドメインソケットで接続したほうが通信コストが低いと聞きました

TCPだと、再送やパケット分割の処理、それに下位層の制御なんかが入るから、
ほとんど伝送エラーが起きない同一ホスト内であれば、Unix domain の方が軽い、
という理屈だと思います。


データを示せないんですが、Solaris 2.6 の時代に、TCP と Unix domain の
速度比較をやってみたことがあります。
そのときは、たいした差が出なくって、別ホストにつなぐようなスケーラビリティを
考えると、TCP の方が良さそう(*)、という判断をしました。

  (*) 自前のプログラムだったので、単純とはいえ、二種類の実装を書きたくなかった

JULY さんが書いている「Solaris だと Unix domain は遅い」というのは、
ぼくも聞いたことがあります(だから、自分で試してみたんですが)。
ここにも、そういう噂を聞いたみたいな書き方をしている人が。
http://www.ne.jp/asahi/hishidama/home/tech/socket/index.html

Unix domain だと、API が隠している実装が、こういうふうになってなきゃいけない、
というのが無いので、OS によって違ってくる可能性はあるのかも。


tmpfs 云々については、JULY さんが書いたこと以上に補足することは、あまり無いです。
Unix domain がファイル名の体裁を取っているのは、そのホストの中で、
接続がユニークになっていることを保証する、手っ取り早いやり方だからです。

また、当時の教科書でも、/tmp というか $TMP とか $TEMP 配下に作ることになってたと思います。
速度云々よりは、リブートなどでプロセスが消えたら、必要が無いファイルだから、ということだと思います。



後、質問とは全然関係ない話なんですが、「TCP と Unix domain の比較」という
言い回しが、非常に気持ち悪い(というか、尻がモゾモゾする感じ)です。
ぼくが socket を覚えたときには、Unix domain に対比するのは INET domain だったので。
でも、ぼくが引用した先も、JULY さんが示した文書でも、TCP と書かれていたので、
今どきは、そう表現するのが当たり前なのかな...

回答として書いた文章も、なんかモゾモゾしながら書きました ^^;

id:xxmasaxx

提示頂いたURLだとUNIXドメインソケットが1割ほど速いのですね。参考になります。
また、OSによって違いがあるとは知りませんでした。

まだまだ勉強不足なため、ガンガン指摘して頂けると助かります。
回答どうもありがとうございました。

2012/01/26 13:42:02
id:a-kuma3

まだまだ勉強不足なため、ガンガン指摘して頂けると助かります。

逆に、ぼくの言い回しが古いんかなー、みたい思いました。
いくつになっても、勉強は終わらんです ><

また、OSによって違いがあるとは知りませんでした。

実装が違っている 可能性がある、だけですよ。
でも、そういうことが無ければ、「Solaris は...」なんて噂も出ないでしょうし。

2012/01/26 13:51:46

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません