Unix socket vs TCP / IP host: port

42

Bisakah seseorang tolong jelaskan kepada saya pro dan kontra menggunakan file socket Unix vs port tcp / ip localhost: ketika mengatur layanan pada server (Ubuntu, FWIW)?

Dalam contoh khusus ini untuk server Python WSGI (uWSGI) tapi saya hanya tertarik secara umum (misalnya, saya tahu Anda dapat mengatur MySQL dengan dua cara).

Saya menyadari bahwa menggunakan tcp / ip berarti bahwa layanan dapat terpapar ke komputer lain, tapi saya hanya tertarik apakah ada pengorbanan kinerja saat mengakses layanan secara lokal.

Tepuk tangan.

Ludo
sumber
1
Baik jawaban yang brilian dan sangat berguna - terima kasih! :)
Ludo

Jawaban:

40

Soket Unix sedikit lebih cepat karena Anda tidak memiliki overhead tcp. Jika Anda menyadari kehilangan kinerja ini adalah masalah beban server. Jika Anda tidak memiliki beban server yang sangat tinggi, Anda tidak akan mengenalinya.

Jika Anda menggunakan Jails (FreeBSD) atau teknologi virtualisasi lainnya untuk memisahkan misal MySQL-Server dari Webserver, Anda sering menggunakan pengaturan tcp / ip alih-alih soket. Aturan firewall perlu membatasi akses.

Anda perlu mencari tahu apakah sistem Anda berada di bawah beban berat sehingga soket adalah suatu keharusan atau Anda dapat fokus pada desain sistem yang bagus (memisahkan layanan), maka solusi tcp / ip akan lebih baik.

Jadi, buat jawaban panjang yang singkat:

Ya, ada perbedaan kinerja, soket lebih cepat. Jika Anda tidak mengalami beban server yang tinggi, pilih saja yang cocok dengan desain sistem Anda.

Benedikt Niessen
sumber
3
Re: soket lebih cepat ... bukan keduanya soket?
Bart Silverstrim
4
@ Bart Silverstrim: tidak, soket adalah soket; TCP memiliki API seperti soket
Javier
7
Saya percaya mereka disebut "soket Unix" dan "soket Internet". ( socket(AF_INET, SOCK_STREAM, ...))
grawity
1
Saya baru saja menguji beberapa mysql-queries dengan php-mysql (unix vs tcp-socket, keduanya localhost). misalnya "pilih SQL_NO_CACHE 1" untuk menghilangkan faktor non-transportasi. tidak ada perbedaan yang terukur. KEDUA memiliki rata-rata 0,25 ms, waktu terbaik untuk KEDUA adalah 0,19 ms.
jens
11

Ini pada dasarnya merupakan tradeoff antara kinerja dan fleksibilitas. Soket domain Unix akan memberi Anda kinerja yang sedikit lebih baik, sementara soket yang terhubung ke localhost memberi Anda portabilitas yang sedikit lebih baik. Anda dapat dengan mudah memindahkan aplikasi server ke OS lain hanya dengan mengubah alamat IP dari localhost ke nama host yang berbeda.

Unix domain socket menggunakan sistem file lokal untuk membuat mekanisme IPC antara proses server dan klien. Anda akan melihat file di / var di suatu tempat ketika soket domain Unix terhubung.

Jika Anda mencari solusi kinerja terbaik, Anda mungkin ingin menjelajahi memori IPC bersama. Tapi, itu sedikit lebih rumit.

IAPaddler
sumber
3

Kelebihan dari soket domain Unix.

  1. Akses dapat dikelola melalui sistem izin pengguna Unix baik dengan mengatur izin pada soket itu sendiri atau dengan server membaca nama pengguna klien yang terhubung.
  2. Lebih sedikit peluang mengekspos soket ke dunia luar secara tidak sengaja. Sebagai contoh jika server juga menjalankan proxy web maka itu mungkin secara tidak sengaja mengizinkan koneksi ke soket di localhost.

Kekurangan dari soket domain Unix

  1. Tidak portabel untuk sistem non-unix.
  2. Bisa canggung dengan chroot, penjara atau sejenisnya
Peter Green
sumber