Unix socket vs TCP / IP хост: порт


42

Чи може хтось, будь ласка, описати мені плюси та мінуси використання файлу сокета Unix проти tcp / ip localhost: port під час налаштування служб на сервері (Ubuntu, FWIW)?

У цьому конкретному випадку це сервер Python WSGI (uWSGI), але мене просто цікавить загалом (наприклад, я знаю, що ви можете налаштувати MySQL обома способами).

Я усвідомлюю, що використання tcp / ip означає, що послуги можуть піддаватися впливу інших машин, але мене просто цікавить, чи є якісь компроміси щодо продуктивності при локальному доступі до послуг.

Ура.


1
Обидва блискучі відповіді та справді корисні - дякую! :)
Лудо

Відповіді:


40

Unix-розетки трохи швидші, оскільки у вас немає tcp-overhead. Якщо ви усвідомлюєте, що це втрата продуктивності - це питання про завантаження сервера. Якщо у вас не дуже велике завантаження сервера, ви не впізнаєте його.

Якщо ви використовуєте Jails (FreeBSD) або якусь іншу технологію віртуалізації для відділення, наприклад, MySQL-сервера від веб-сервера, ви часто використовуєте налаштування tcp / ip замість сокетів. Правилами брандмауера потрібно обмежувати доступ.

Вам потрібно з’ясувати, чи піддається вашій системі велике навантаження, щоб розетка була необхідною, або ви можете зосередитись на приємному дизайні системи (роздільній службі), тоді рішення tcp / ip було б краще.

Тому зробіть довгу відповідь короткою:

Так, є різниця в продуктивності, розетки швидше. Якщо ви не страждаєте від великої завантаженості сервера, просто виберіть те, що краще відповідає дизайну вашої системи.


3
Re: розетки швидше ... чи не обидва вони розетки?
Барт Сільверстрім

4
@Bart Silverstrim: ні, розетки - це розетки; TCP має подібний сокет API
Javier

7
Я вважаю, що їх називають "розетками Unix" та "Інтернет-розетками". ( socket(AF_INET, SOCK_STREAM, ...))
grawity

1
Я щойно перевірив кілька mysql-запитів із php-mysql (unix vs tcp-socket, обидва localhost). наприклад, "виберіть SQL_NO_CACHE 1" для усунення не транспортних факторів. різниці, що піддаються вимірюванню, не було BOTH був в середньому 0,25 мс, найкращий час для BOTH був 0,19 мс.
jens

11

В основному це компроміс між продуктивністю та гнучкістю. Розетки домену Unix дадуть вам трохи кращі показники, тоді як сокет, підключений до localhost, дає вам трохи кращу портативність. Ви можете легко перемістити додаток сервера до іншої ОС, просто змінивши IP-адресу з localhost на інше ім'я хоста.

Сокет домену Unix використовує локальну файлову систему для створення механізму IPC між процесами сервера та клієнта. Десь ви побачите файл в / var, коли підключено розетку домену Unix.

Якщо ви шукаєте виключно оптимальне рішення про продуктивність, ви можете вивчити IPC спільної пам'яті. Але, це трохи складніше.


3

Плюси розеток домену Unix.

  1. Доступ можна керувати через систему дозволів користувача Unix або шляхом встановлення дозволів на сам сокет, або через сервер, який читає ім'я користувача підключеного клієнта.
  2. Менший шанс ненавмисного потрапляння гнізда на зовнішній світ. Наприклад, якщо сервер також працює веб-проксі, то це може ненавмисно дозволити з'єднання з сокетами на localhost.

Мінуси розеток домену Unix

  1. Не переноситься на не-Unix системи.
  2. Може бути незручно із хротами, тюрмами чи подібним
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.