web-dev-qa-db-ja.com

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

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

相互通信をUnixドメインソケットに置き換えるとパフォーマンスが向上するかどうか疑問に思っていましたか?

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

91
RDX

はい。Unixドメインソケットによるローカルプロセス間通信は、TCPオーバーヘッドが少ないため、ループバックlocalhost接続による通信よりも高速になります。 here および here を参照してください。

87
0x4a6f4672

このベンチマーク: 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カスタムプロトコルがあります。

62
Guillermo Lopez

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

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

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

Throughput per data size

31
woodings

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

6
peterDriscoll