Socket Unix vs host TCP / IP: puerto

42

¿Podría alguien describirme los pros y los contras del uso de un archivo de socket Unix frente a un tcp / ip localhost: port al configurar servicios en un servidor (Ubuntu, FWIW)?

En este caso particular, es para un servidor Python WSGI (uWSGI) pero solo estoy interesado en general (por ejemplo, sé que puede configurar MySQL de ambas maneras).

Me doy cuenta de que usar tcp / ip significa que los servicios pueden estar expuestos a otras máquinas, pero solo estoy interesado en saber si hay compensaciones de rendimiento al acceder a los servicios localmente.

Aclamaciones.

Ludo
fuente
1
Ambas respuestas brillantes y realmente útiles, ¡gracias! :)
Ludo

Respuestas:

40

Los sockets Unix son un poco más rápidos, ya que no tiene el tcp-gastos generales. Si se da cuenta de que esta pérdida de rendimiento es una cuestión de carga del servidor. Si no tiene una carga de servidor muy alta, no la reconocerá.

Si usa Jails (FreeBSD) o alguna otra tecnología de virtualización para separar, por ejemplo, el servidor MySQL del servidor web, a menudo usa la configuración tcp / ip en lugar de sockets. Sin embargo, las reglas del firewall deben restringir el acceso.

Debe averiguar si su sistema está bajo una gran carga para que un socket sea imprescindible o si puede centrarse en un buen diseño del sistema (servicios de separación), entonces una solución tcp / ip sería mejor.

Entonces haga una respuesta larga corta:

Sí, hay una diferencia de rendimiento, los enchufes son más rápidos. Si no sufre una gran carga del servidor, simplemente elija lo que mejor se adapte al diseño de su sistema.

Benedikt Niessen
fuente
3
Re: los enchufes son más rápidos ... ¿no son ambos enchufes?
Bart Silverstrim
44
@Bart Silverstrim: no, los enchufes son enchufes; TCP tiene una API tipo socket
Javier
77
Creo que se llaman "tomas Unix" y "tomas de Internet". ( socket(AF_INET, SOCK_STREAM, ...))
Grawity
1
Acabo de probar algunas consultas mysql con php-mysql (unix vs tcp-socket, ambos localhost). por ejemplo "seleccione SQL_NO_CACHE 1" para eliminar los factores que no son de transporte. No hubo diferencia medible. AMBOS tuvieron un promedio de 0.25 ms, el mejor tiempo para AMBOS fue 0.19 ms.
jens
11

Básicamente es una compensación entre rendimiento y flexibilidad. Los sockets de dominio Unix le brindarán un rendimiento un poco mejor, mientras que un socket conectado a localhost le brinda una portabilidad un poco mejor. Puede mover fácilmente la aplicación del servidor a otro sistema operativo simplemente cambiando la dirección IP de localhost a un nombre de host diferente.

Un socket de dominio Unix usa el sistema de archivos local para crear un mecanismo IPC entre los procesos del servidor y el cliente. Verá un archivo en / var en algún lugar cuando el socket del dominio Unix esté conectado.

Si está buscando la solución de rendimiento definitiva, puede explorar una memoria IPC compartida. Pero eso es un poco más complejo.

IAPaddler
fuente
3

Ventajas de los sockets de dominio Unix.

  1. El acceso se puede administrar a través del sistema de permisos de usuario de Unix, ya sea configurando los permisos en el socket o por el servidor que lee el nombre de usuario del cliente que se conecta.
  2. Menos posibilidades de exponer accidentalmente el enchufe al mundo exterior. Por ejemplo, si el servidor también ejecuta un proxy web, eso puede permitir inadvertidamente conexiones a sockets en localhost.

Contras de los sockets de dominio Unix

  1. No es portátil para sistemas no Unix.
  2. Puede ser incómodo con chroots, cárceles o similares.
Peter Green
fuente