Сокет Unix против хоста TCP / IP: порт

42

Может ли кто-нибудь описать мне плюсы и минусы использования файла сокета Unix против порта tcp / ip localhost:: при настройке служб на сервере (Ubuntu, FWIW)?

В данном конкретном случае это для Python WSGI-сервера (uWSGI), но я просто заинтересован в целом (например, я знаю, что вы можете настроить MySQL обоими способами).

Я понимаю, что использование tcp / ip означает, что сервисы могут быть доступны другим машинам, но меня просто интересует, есть ли какие-либо компромиссы производительности при доступе к сервисам локально.

Приветствия.

лудо
источник
1
И блестящие ответы, и действительно полезные - спасибо! :)
Людо

Ответы:

40

Unix-сокеты немного быстрее, так как у вас нет накладных расходов tcp. Если вы понимаете, что потеря производительности - это вопрос загрузки сервера. Если у вас не очень высокая нагрузка на сервер, вы не узнаете ее.

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

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

Поэтому сделайте длинный ответ коротким:

Да, разница в производительности есть, сокеты быстрее. Если вы не страдаете высокой нагрузкой на сервер, просто выберите то, что лучше соответствует дизайну вашей системы.

Бенедикт Ниссен
источник
3
Re: сокеты быстрее ... разве они не сокеты?
Барт Сильверстрим
4
@ Барт Сильверстрим: нет, розетки - это розетки; TCP имеет сокетоподобный API
Хавьер
7
Я считаю, что они называются «сокеты Unix» и «интернет-сокеты». ( socket(AF_INET, SOCK_STREAM, ...))
Гравитация
1
Я только что протестировал несколько MySQL-запросов с php-MySQL (Unix против TCP-сокета, оба localhost). например, «выберите SQL_NO_CACHE 1», чтобы исключить нетранспортные факторы. не было никакой измеримой разницы. ОБА имели в среднем 0,25 мс, лучшее время для ОБА составляло 0,19 мс.
Дженс
11

Это в основном компромисс между производительностью и гибкостью. Доменные сокеты Unix дадут вам немного лучшую производительность, в то время как сокет, подключенный к localhost, даст вам немного лучшую переносимость. Вы можете легко переместить серверное приложение на другую ОС, просто изменив IP-адрес с localhost на другое имя хоста.

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

Если вы ищете исключительно оптимальное решение для повышения производительности, вы можете изучить IPC с общей памятью. Но это немного сложнее.

IAPaddler
источник
3

Плюсы доменных сокетов Unix.

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

Недостатки доменных сокетов Unix

  1. Не переносимо на не-Unix системы.
  2. Может быть неудобно с chroots, тюрьмы или аналогичные
Питер Грин
источник