Conexión de bucle de retorno TCP frente al rendimiento del socket de dominio Unix

116

Trabajar en una aplicación basada en Android e iOS que requiere comunicación con un servidor que se ejecuta en el mismo dispositivo. Actualmente se usa una conexión de bucle de retorno TCP para comunicarse con la aplicación y el servidor (aplicación escrita en la capa de usuario, servidor escrito en C ++ usando Android NDK)

Me preguntaba si reemplazar la intercomunicación con el socket de dominio Unix mejoraría el rendimiento.

O, en general, ¿hay alguna evidencia / teoría que demuestre que el socket de dominio Unix daría un mejor rendimiento que la conexión de bucle de retorno TCP?

RDX
fuente
3
Recuerde que los sockets locales (sockets de dominio UNIX) necesitan un archivo en el sistema de archivos. El uso de la dirección de bucle de retorno de TCP lo mantiene todo en la memoria. Y si tiene que usar sockets TCP remotos, podría ser más fácil integrar otro socket TCP en lugar de jugar con un nuevo socket y una familia de direcciones.
Algún tipo programador
1
@JoachimPileborg Cuando se desarrolla solo para Linux (Android), existe la opción de utilizar direcciones de socket de dominio UNIX abstractas , que no necesitan un archivo en el sistema de archivos.
thuovila
consulte stackoverflow.com/questions/14643571/… para la conexión de Android.
RDX
8
@Someprogrammerdude Necesitan un archivo en el sistema de archivos, pero eso no significa que todo vaya al disco y vuelva.
Marqués de Lorne
3
@Someprogrammerdude Solo el nombre de archivo, la propiedad y la información de permisos se almacenan en el sistema de archivos. Toda la transferencia de datos real ocurre completamente en la memoria.
Jesin

Respuestas:

105

Sí, la comunicación local entre procesos mediante sockets de dominio Unix debería ser más rápida que la comunicación mediante conexiones de bucle invertido localhost porque tiene menos sobrecarga de TCP, consulte aquí .

0x4a6f4672
fuente
12
el primer enlace cita el segundo enlace, que es de 2005 (antiguo). y solo cubre FreeBSD
Janus Troelsen
7
Esta respuesta es incorrecta, cuando se prueba el loopback tcp en linux moderno es tan rápido y, a veces, más rápido que UDS. puede proporcionar un punto de referencia si es necesario
easytiger
10
Esta respuesta es absolutamente correcta. La interfaz de bucle invertido sigue siendo TCP, lo que significa que todavía tiene la sobrecarga de TCP (control de congestión, control de flujo, gestión de flujo (pedido de paquetes IP, retransmisión, etc.)). Los sockets de dominio Unix no hacen nada de lo anterior porque fue diseñado desde cero para ejecutarse localmente, lo que significa que no hay problemas de congestión, no hay diferencias de velocidad entre el servidor / cliente que requieren control de flujo, no se pierden paquetes, etc. Google esto si tiene dudas , no es algo nuevo.
JSON
4
¿Qué pasa con el UDP local?
CMCDragonkai
2
dado que el primer enlace está muerto (HTTP 404) ... esta es la razón por la que la mejor práctica de stackoverflow es al menos proporcionar una cita relevante breve / concisa de la URL de origen en el momento de escribir la respuesta (luego, cuando el enlace se cae el breve resumen todavía está disponible).
Trevor Boyd Smith
80

Este punto de referencia: https://github.com/rigtorp/ipc-bench proporciona pruebas de latencia y rendimiento para sockets TCP, Sockets de dominio Unix (UDS) y 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

La reducción de la latencia del 66% y casi 7 veces más de rendimiento explican por qué la mayoría del software de rendimiento crítico tiene su propio protocolo personalizado de IPC.

Guillermo Lopez
fuente
7
¡Me parece que su producto es una respuesta al problema! Quizás por eso responden a esas preguntas; porque saben una respuesta.
GreenReaper
Esta es una gran respuesta porque tiene algunos números. El rendimiento de TCP a UNIX es un 350% mejor, de UNIX a PIPE un 40% en un i5.
ScalaWilliam
13
@GreenReaper La respuesta es realmente relevante, pero la línea de nuestro producto Torusware Speedus ... viene con 2 versiones, Speedus Lite y Speedus Extreme Performance (EP) no lo es, y hace que todo suene como un anuncio barato.
Dmitry Grigoryev
3
Correo no deseado. Y no, su producto no es relevante en una comparación entre los sockets TCP y Unix. Hay muchas alternativas de sentido común a los sockets, cada una fuera de lo que pide el OP
JSON
El uso de esa herramienta no está suficientemente explicado. ¿Existe de alguna manera una página que explique cómo llamar al cliente y al servidor?
falkb
40

El banco de pruebas de Redis muestra que el socket de dominio Unix puede ser significativamente más rápido que el loopback de TCP.

Cuando los programas de referencia del servidor y del cliente se ejecutan en la misma caja, se pueden utilizar tanto el loopback TCP / IP como los sockets de dominio Unix. Dependiendo de la plataforma, los sockets de dominio Unix pueden alcanzar alrededor de un 50% más de rendimiento que el loopback TCP / IP (en Linux, por ejemplo). El comportamiento predeterminado de redis-benchmark es utilizar el loopback TCP / IP.

Sin embargo, esta diferencia solo importa cuando el rendimiento es alto.

Rendimiento por tamaño de datos

carpinterías
fuente
8

Los sockets de dominio Unix suelen ser dos veces más rápidos que un socket TCP cuando ambos pares están en el mismo host. Los protocolos de dominio Unix no son un conjunto de protocolos real, sino una forma de realizar la comunicación cliente / servidor en un solo host utilizando la misma API que se utiliza para clientes y servidores en diferentes hosts. Los protocolos de dominio Unix son una alternativa a los métodos de comunicación entre procesos (IPC).

peterDriscoll
fuente