Unix сокет против TCP/IP host:port

Вопрос или проблема

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

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

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

С уважением.

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

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

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

Вкратце:

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

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

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

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

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

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

Минусы Unix-доменных сокетов

  1. Не портируются на не-юнкс системы.
  2. Могут быть неудобны с chroots, jails или подобными технологиями.

На моем компьютере, Ryzen 3900X, Ubuntu 22,

простое C++ приложение TCP сервера, которое только отправляет пакеты по 64K, и простое C++ приложение приемника, которое получает 100GB этих пакетов и копирует их только во внутренний буфер, одно-поточное:

достигает ~30-33 GBit/сек для TCP-соединения (~4.0GB/сек) (не MBit)

и ~55-58GBit/сек для сокетного соединения (~7.3 GB/сек)

и ~492Gbit/сек для копирования памяти в процессе (~61GB/сек)

и, конечно, будет еще быстрее для подхода с “общей памятью”, где вы вообще не делаете копий, а просто передаете ссылку с каким-то механизмом синхронизации.

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

Таким образом, для компьютера с высоким пропускным способом, ограниченными ресурсами, встраиваемыми компьютерами, такими как Mosquito на Raspberry Pi, будет преимущество в использовании унисокета и преимущество в неразделении общего приложения на слишком маленькие модули.

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

При разработке для максимальной производительности стоит знать, что вывод в консоль Linux относительно затратен — так что, если в режиме тестирования/производства можно обойтись без вывода на консоль, вы можете получить значительный прирост производительности.

.

Ответ или решение

Unix-сокет против TCP/IP localhost:port: подробно о плюсах и минусах

В современном процессе разработки и развертывания серверных приложений существует две основные опции для обеспечения связи между сервисами: использование Unix-сокетов и TCP/IP localhost:port. Каждая из этих технологий имеет свои особенности, плюсы и минусы, которые могут существенно влиять на производительность и архитектуру системы.

Теория: Unix-сокеты и TCP/IP localhost:port

Unix-сокеты представляют собой интерфейсы межпроцессорного взаимодействия (IPC), которые позволяют обмениваться данными между процессами на одной машине через файловую систему. Это обычно более быстрый метод связи благодаря отсутствию сетевых накладных расходов. Они легко создаются и управляются через файловую систему Unix и обеспечивают защиту на уровне прав доступа пользователей.

С другой стороны, TCP/IP localhost:port предлагает более стандартный способ связи, который использует протокол IP для обмена данными. TCP-подключения являются почти универсальными и могут быть использованы для связи не только между процессами на одном сервере, но и между разными машинами в сети. В этом и заключается их портативность и гибкость.

Пример: Условия и результаты использования

Рассматривая типичные примеры использования, можем сказать, что в случае с высоконагруженными системами, такими как серверы СУБД или веб-приложения, выбирая между Unix-сокетами и TCP/IP localhost, стоит учитывать нагрузку на систему. Для приложений, таких как Python WSGI-сервер (например, uWSGI), которые управляются локально, использование Unix-сокетов часто предпочтительнее из-за их более высокой производительности на локальном уровне.

Тесты производительности показывают, что Unix-сокеты могут обеспечить скорость передачи данных до 55-58 GBit/sec по сравнению с 30-33 GBit/sec для TCP-подключений в testbed с использованием Ryzen 3900X и Ubuntu 22. В то же время такие показатели могут быть критичны для приложений, работающих в условиях строгого лимита ресурсов (например, для встраиваемых систем или микросервисных архитектур на Raspberry Pi).

Применение: Когда и что выбрать

При выборе между Unix-сокетами и TCP/IP для локального обслуживания, основное внимание следует уделять не только производительности, но и общей архитектуре системы. Если приложению требуется высокая скорость передачи данных и оно работает в высоконагруженной среде, где любая дополнительная задержка может существенно повлиять на работу, то Unix-сокеты — наилучший выбор. Это особенно актуально для ресурсов, которые работают без внешней сети и имеют ограниченные аппаратные возможности.

Однако, если архитектура требует гибкости и возможности переноса приложения между различными системами или виртуализациями (например, использование контейнеров или изоляции на уровне jails в FreeBSD), TCP/IP localhost:port может предоставить необходимую гибкость и удобство, не уступая в удобстве настройки безопасности путем ограничения доступа через файервол.

Заключение

Таким образом, выбор между Unix-сокетами и TCP/IP localhost:port требует взвешенного подхода, учитывающего специфику конкретной системы и ее архитектурные требования. Для оптимального решения необходимо учитывать все аспекты, от производительности и безопасности до переносимости и удобства наличия единого интерфейса. Эти решения не взаимоисключают друг друга и могут быть выбраны в зависимости от конкретных задач и условий эксплуатации.

Оцените материал
Добавить комментарий

Капча загружается...