Соединение с обратной связью TCP и производительность сокета домена Unix

116

Работа над приложением на базе Android и iOS, которое требует связи с сервером, работающим на том же устройстве. В настоящее время используется петлевое соединение TCP для связи с приложением и сервером (приложение написано на пользовательском уровне, сервер написан на C ++ с использованием Android NDK)

Мне было интересно, улучшит ли производительность замена межсетевого взаимодействия на сокет домена Unix?

Или в целом есть какие-либо доказательства / теории, подтверждающие, что сокет домена Unix даст лучшую производительность, чем соединение с обратной связью TCP?

Рохит
источник
3
Помните, что локальным сокетам (сокетам домена UNIX) нужен файл в файловой системе. Использование адреса обратной связи TCP позволяет сохранить все в памяти. А если вам нужно использовать удаленные сокеты TCP, может быть проще интегрировать другой сокет TCP, чем возиться с новым семейством сокетов и адресов.
Какой-то чувак-программист
1
@JoachimPileborg При разработке только для Linux (Android) есть возможность использовать абстрактные адреса сокетов домена UNIX, которым не нужен файл в файловой системе.
thuovila
обратитесь к stackoverflow.com/questions/14643571/… для подключения к Android.
Rohit
8
@Someprogrammerdude Им нужен файл в файловой системе, но это не значит, что все идет на диск и обратно.
Marquis of Lorne
3
@Someprogrammerdude В файловой системе сохраняется только информация о имени файла, владельце и правах доступа. Вся фактическая передача данных происходит полностью в памяти.
Jesin

Ответы:

105

Да, локальная межпроцессная связь через сокеты домена unix должна быть быстрее, чем связь через loopback-соединения localhost, потому что у вас меньше накладных расходов TCP, см. Здесь .

0x4a6f4672
источник
12
первая ссылка цитирует вторую ссылку, которая датируется 2005 годом (старая). и это касается только FreeBSD
Янус Троэльсен
7
Этот ответ неверен, при тестировании loopback tcp на современном Linux так же быстро, а иногда и быстрее, чем UDS. при необходимости может предоставить эталонный тест
easytiger
10
Это абсолютно правильный ответ. Интерфейс обратной связи по-прежнему является TCP, что означает, что у вас все еще есть накладные расходы TCP (контроль перегрузки, управление потоком, управление потоком (упорядочение IP-пакетов, повторная передача и т. Д.)). Доменные сокеты Unix не выполняют ничего из вышеперечисленного, потому что он был разработан с нуля для локального запуска, что означает отсутствие проблем с перегрузкой, отсутствие разницы в скорости между сервером / клиентом, требующим управления потоком, отсутствие отброшенных пакетов и т. Д. Google, если есть сомнения , а не новость.
JSON
4
А как насчет локального UDP?
CMCDragonkai
2
учитывая, что первая ссылка мертва (HTTP 404) ... вот почему лучшая практика stackoverflow состоит в том, чтобы, по крайней мере, предоставить короткую / сжатую соответствующую цитату из исходного URL-адреса во время написания ответа (затем, когда ссылка отключается краткое изложение все еще доступно).
Trevor Boyd Smith
80

Этот тест: https://github.com/rigtorp/ipc-bench предоставляет тесты задержки и пропускной способности для сокетов TCP, сокетов домена Unix (UDS) и 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

Снижение задержки на 66% и увеличение пропускной способности почти в 7 раз объясняют, почему для большинства критически важного по производительности программного обеспечения есть собственный протокол IPC.

Гильермо Лопес
источник
7
Мне кажется, их продукт - это ответ на проблему! Может быть, поэтому они отвечают на эти вопросы; потому что они знают ответ.
GreenReaper
Это отличный ответ, потому что в нем есть цифры. Пропускная способность от TCP к UNIX на 350% лучше, от UNIX к PIPE - на 40% на i5.
ScalaWilliam
13
@GreenReaper Ответ действительно актуален, но линейка нашего продукта Torusware Speedus ... поставляется с двумя версиями, Speedus Lite и Speedus Extreme Performance (EP) нет, и это заставляет все это звучать как дешевую рекламу.
Дмитрий Григорьев
3
Спам. И нет, его продукт не имеет отношения к сравнению сокетов TCP и Unix. Есть много разумных альтернатив сокетам - каждая из них выходит за рамки того, что запрашивает OP
JSON
Использование этого инструмента недостаточно объяснено. Есть ли какая-то страница, объясняющая, как вызывать клиент и сервер?
falkb
40

Redis тесты показывают доменный сокет Unix может быть значительным быстрее , чем TCP шлейф.

Когда программы тестирования сервера и клиента работают на одном компьютере, можно использовать как петлевые сокеты TCP / IP, так и сокеты домена unix. В зависимости от платформы сокеты домена unix могут достигать примерно на 50% большей пропускной способности, чем петля TCP / IP (например, в Linux). По умолчанию redis-benchmark использует петлевую проверку TCP / IP.

Однако эта разница имеет значение только при высокой пропускной способности.

Пропускная способность на размер данных

леса
источник
8

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

Питер Дрисколл
источник