Koneksi loopback TCP vs kinerja Soket Domain Unix

116

Bekerja pada aplikasi berbasis Android dan iOS yang membutuhkan komunikasi dengan server yang berjalan di perangkat yang sama. Saat ini menggunakan koneksi loopback TCP untuk berkomunikasi dengan Aplikasi dan Server (Aplikasi yang ditulis dalam lapisan pengguna, server yang ditulis dalam C ++ menggunakan Android NDK)

Saya bertanya-tanya apakah mengganti komunikasi antar dengan soket Domain Unix akan meningkatkan kinerja?

Atau secara umum adakah bukti / teori yang membuktikan bahwa socket Domain Unix akan memberikan performa yang lebih baik dari koneksi loopback TCP?

RDX
sumber
3
Ingatlah bahwa soket lokal (soket domain UNIX) membutuhkan file di sistem file. Menggunakan alamat loopback TCP menyimpan semuanya di memori. Dan jika Anda harus menggunakan soket TCP jarak jauh, mungkin lebih mudah untuk mengintegrasikan soket TCP lain daripada mengutak-atik soket baru dan kelompok alamat.
Beberapa programmer dude
1
@JoachimPileborg Saat mengembangkan hanya untuk Linux (Android), terdapat opsi untuk menggunakan alamat soket domain UNIX abstrak , yang tidak memerlukan file di sistem file.
thuovila
lihat stackoverflow.com/questions/14643571/… untuk koneksi android.
RDX
8
@Someprogrammerdude Mereka membutuhkan file di sistem file, tetapi itu tidak berarti semuanya pergi ke disk dan kembali.
Marquis dari Lorne
3
@Someprogrammerdude Hanya info nama file, kepemilikan, dan izin yang pernah disimpan di sistem file. Semua transfer data aktual terjadi seluruhnya di memori.
Jesin

Jawaban:

105

Ya, komunikasi antarproses lokal dengan soket domain unix harus lebih cepat daripada komunikasi dengan koneksi localhost loopback karena Anda memiliki lebih sedikit overhead TCP, lihat di sini .

0x4a6f4672
sumber
12
link pertama mengutip link kedua, yaitu dari tahun 2005 (lama). dan itu hanya mencakup FreeBSD
Janus Troelsen
7
Jawaban ini salah, ketika diuji loopback tcp di linux modern secepat dan terkadang lebih cepat dari UDS. dapat memberikan patokan jika diperlukan
easytiger
10
Jawaban ini sangat benar. Antarmuka loopback masih TCP, artinya Anda masih memiliki overhead TCP (kontrol kongesti, kontrol aliran, manajemen aliran (pengurutan paket IP, transmisi ulang, dll)). Soket domain Unix tidak melakukan hal-hal di atas karena dirancang dari awal untuk dijalankan secara lokal, yang berarti tidak ada masalah kemacetan, tidak ada perbedaan kecepatan antara server / klien yang memerlukan kontrol aliran, tidak ada paket yang jatuh, dll. Google ini jika ragu-ragu , bukan hal baru.
JSON
4
Bagaimana dengan UDP lokal?
CMCDragonkai
2
mengingat bahwa tautan pertama sudah mati (HTTP 404) ... inilah mengapa praktik terbaik stackoverflow adalah setidaknya memberikan kutipan relevan yang singkat / ringkas dari URL sumber pada saat penulisan jawaban (kemudian ketika tautan turun ringkasan singkatnya masih tersedia).
Trevor Boyd Smith
80

Tolok ukur ini: https://github.com/rigtorp/ipc-bench menyediakan tes latensi dan throughput untuk soket TCP, Soket Domain Unix (UDS), dan 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

Pengurangan latensi 66% dan throughput hampir 7X lebih banyak menjelaskan mengapa sebagian besar perangkat lunak yang mengutamakan kinerja memiliki protokol khusus IPC sendiri.

Guillermo Lopez
sumber
7
Kedengarannya seperti produk mereka adalah jawaban untuk masalah ini! Mungkin itu sebabnya mereka menjawab pertanyaan-pertanyaan itu; karena mereka tahu jawabannya.
GreenReaper
Ini adalah jawaban yang bagus karena memiliki beberapa angka. Throughput dari TCP ke UNIX 350% lebih baik, UNIX ke PIPE 40% di i5.
ScalaWilliam
13
@GreenReaper Jawabannya memang relevan, tetapi produk Torusware Speedus kami ... hadir dengan 2 versi, Speedus Lite dan Speedus Extreme Performance (EP) bukan, dan itu membuat semuanya terdengar seperti iklan murahan.
Dmitry Grigoryev
3
Spam. Dan tidak, produknya tidak relevan dalam perbandingan antara soket TCP dan Unix. Ada banyak alternatif yang masuk akal untuk soket - masing-masing di luar yang diminta OP
JSON
Penggunaan alat itu tidak cukup dijelaskan. Apakah ada halaman yang menjelaskan cara memanggil klien dan server?
falkb
40

Tolok ukur Redis menunjukkan soket domain unix dapat menjadi signifikan lebih cepat daripada loopback TCP.

Ketika program benchmark server dan klien berjalan pada kotak yang sama, baik TCP / IP loopback dan soket domain unix dapat digunakan. Bergantung pada platformnya, soket domain unix dapat mencapai sekitar 50% lebih banyak throughput daripada loopback TCP / IP (di Linux misalnya). Perilaku default redis-benchmark adalah menggunakan loopback TCP / IP.

Namun, perbedaan ini hanya penting jika throughput tinggi.

Throughput per ukuran data

woodings
sumber
8

Soket domain Unix sering kali dua kali lebih cepat dari soket TCP ketika kedua rekan berada di host yang sama. Protokol domain Unix bukanlah rangkaian protokol yang sebenarnya, tetapi cara melakukan komunikasi klien / server pada satu host menggunakan API yang sama yang digunakan untuk klien dan server pada host yang berbeda. Protokol domain Unix adalah alternatif dari metode komunikasi antarproses (IPC).

peterDriscoll
sumber