TCPループバック接続とUnixドメインソケットのパフォーマンス


116

同じデバイスで実行されているサーバーとの通信を必要とするAndroidおよびiOSベースのアプリケーションでの作業。現在、アプリとサーバーとの通信にTCPループバック接続を使用しています(ユーザー層で作成されたアプリ、Android NDKを使用してC ++で作成されたサーバー)

相互通信をUnixドメインソケットに置き換えるとパフォーマンスが向上するのだろうか。

または一般的に、Unix DomainソケットがTCPループバック接続よりも優れたパフォーマンスを提供することを証明する証拠/理論はありますか?


3
ローカルソケット(UNIXドメインソケット)には、ファイルシステム内のファイルが必要です。TCPループバックアドレスを使用すると、すべてがメモリ内に保持されます。また、リモートTCPソケットを使用する必要がある場合は、新しいソケットとアドレスファミリをいじるよりも、別のTCPソケットを統合する方が簡単な場合があります。
一部のプログラマーは、

1
@JoachimPileborg Linux(Android)専用に開発する場合、ファイルシステムにファイルを必要としない抽象的な UNIXドメインソケットアドレスを使用するオプションがあります。
thuovila 2013

Android接続については、stackoverflow.com / questions / 14643571 /…を参照してください。
RDX

8
@Someprogrammerdude彼らはファイルシステムにファイルを必要としますが、それはすべてがディスクに行き帰るという意味ではありません。
ローン侯爵

3
@Someprogrammerdudeファイルシステムに保存されるのは、ファイル名、所有権、および許可情報のみです。実際のデータ転送はすべて完全にメモリ内で行われます。
ジェシン

回答:


105

はい。UNIXのドメインソケットによるローカルプロセス間通信は、TCPオーバーヘッドが少ないため、ループバックローカルホスト接続による通信よりも高速ですこちらを参照してください


12
最初のリンクは、2005年からの2番目のリンクを引用しています(古い)。FreeBSDのみを対象
Janus Troelsen

7
最新のLinuxでテストされたループバックTCPがUDSよりも高速で、時には高速である場合、この答えは間違っています。必要に応じてベンチマークを提供できます
easytiger '18 / 06/18

10
この答えは完全に正しいです。ループバックインターフェイスは引き続きTCPです。つまり、TCPのオーバーヘッド(輻輳制御、フロー制御、ストリーム管理(IPパケットの順序付け、再送信など))が残っています。Unixドメインソケットは、ローカルで実行されるように最初から設計されているため、上記のいずれも実行しません。つまり、輻輳の問題、フロー制御を必要とするサーバー/クライアント間の速度の違い、パケットのドロップなどがないためです。 、新しいものではありません。
JSON

4
ローカルUDPはどうですか?
CMCDragonkai 2014年

2
最初のリンクが停止していることを考えると(HTTP 404)...これが、stackoverflowのベストプラクティスが、回答の執筆時に(リンクがダウンしたとき)少なくともソースURLからの短い/簡潔な関連引用を提供することである理由です短い要約はまだ入手可能です)。
Trevor Boyd Smith、

80

このベンチマーク:https : //github.com/rigtorp/ipc-bench は、TCPソケット、Unixドメインソケット(UDS)、およびPIPEのレイテンシおよびスループットテストを提供します。

Here you have the results on a single CPU 3.3GHz Linux machine :

TCP average latency: 6 us

UDS average latency: 2 us

PIPE average latency: 2 us

TCP average throughput: 0.253702 million msg/s

UDS average throughput: 1.733874 million msg/s

PIPE average throughput: 1.682796 million msg/s

66%のレイテンシ削減とほぼ7 倍のスループットにより、ほとんどのパフォーマンス重視のソフトウェアに独自のIPCカスタムプロトコルがある理由が説明されます。


7
彼らの製品が問題に対する答えであるように私に聞こえます!多分それが彼らがそれらの質問に答えている理由です。彼らは答えを知っているからです。
GreenReaper 2016

いくつかの数字があるので、これは素晴らしい答えです。i5でのTCPからUNIXへのスループットは350%向上し、UNIXからPIPEへのスループットは40%向上しています。
ScalaWilliam 2016

13
@GreenReaper答えは確かに関連性がありますが、私たちのTorusware Speedus製品のラインナップには2つのバージョンが付属しています。SpeedusLiteとSpeedus Extreme Performance(EP)はありません。そして、全体が安い広告のように聞こえます。
Dmitry Grigoryev

3
スパム。いいえ、彼の製品は、TCPソケットとUnixソケットの比較には関係ありません。ソケットには常識的な選択肢がたくさんあり
ます

そのツールの使用法は十分に説明されていません。クライアントとサーバーを呼び出す方法を説明するページがどういうわけかありますか?
falkb

40

Redis ベンチマークは、UNIXドメインソケットがTCPループバックよりも大幅に高速になることを示しています。

サーバーとクライアントのベンチマークプログラムを同じボックスで実行する場合、TCP / IPループバックとUNIXドメインソケットの両方を使用できます。プラットフォームに応じて、UNIXドメインソケットは、TCP / IPループバック(Linuxなど)よりも約50%高いスループットを達成できます。redis-benchmarkのデフォルトの動作は、TCP / IPループバックを使用することです。

ただし、この違いはスループットが高い場合にのみ重要です。

データサイズあたりのスループット


8

Unixドメインソケットは、両方のピアが同じホスト上にある場合、TCPソケットの2倍の速度になることがよくあります。Unixドメインプロトコルは実際のプロトコルスイートではありませんが、異なるホスト上のクライアントとサーバーに使用されているものと同じAPIを使用して、単一のホスト上でクライアント/サーバー通信を実行する方法です。Unixドメインプロトコルは、プロセス間通信(IPC)メソッドに代わるものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.