同じデバイスで実行されているサーバーとの通信を必要とするAndroidおよびiOSベースのアプリケーションでの作業。現在、アプリとサーバーとの通信にTCPループバック接続を使用しています(ユーザー層で作成されたアプリ、Android NDKを使用してC++で作成されたサーバー)
相互通信をUnixドメインソケットに置き換えるとパフォーマンスが向上するかどうか疑問に思っていましたか?
または、一般的に、UnixドメインソケットがTCPループバック接続よりも優れたパフォーマンスを提供することを証明する証拠/理論はありますか?
このベンチマーク: 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カスタムプロトコルがあります。
Redis ベンチマーク は、UnixドメインソケットがTCPループバックよりも大幅に高速化できることを示しています。
サーバーとクライアントのベンチマークプログラムを同じボックスで実行すると、TCP/IPループバックとUNIXドメインソケットの両方を使用できます。プラットフォームによっては、Unixドメインソケットは、TCP/IPループバック(Linuxなど)よりも約50%高いスループットを達成できます。 redis-benchmarkのデフォルトの動作は、TCP/IPループバックを使用することです。
ただし、この違いはスループットが高い場合にのみ重要です。
多くの場合、Unixドメインソケットは、両方のピアが同じホスト上にある場合、TCPソケットの2倍の速度です。 Unixドメインプロトコルは実際のプロトコルスイートではなく、異なるホスト上のクライアントとサーバーに使用される同じAPIを使用して、単一のホスト上でクライアント/サーバー通信を実行する方法です。 Unixドメインプロトコルは、プロセス間通信(IPC)メソッドの代替です。