Todo el mundo parece decir que las canalizaciones con nombre son más rápidas que los sockets IPC. ¿Cuánto más rápido son? Preferiría usar sockets porque pueden hacer comunicación bidireccional y son muy flexibles, pero elegiré la velocidad sobre la flexibilidad si es en una cantidad considerable.
linux
performance
sockets
ipc
named-pipes
user19745
fuente
fuente
pipe(2)
(er,?mkfifo(3)
) puede ser el ganador, pero no lo sabrá hasta que lo intente.Respuestas:
Le sugiero que tome el camino fácil primero, aislando cuidadosamente el mecanismo de IPC para que pueda cambiar de enchufe a tubería, pero definitivamente iría con el enchufe primero. Debe asegurarse de que el rendimiento de IPC sea un problema antes de optimizar de forma preventiva.
Y si se mete en problemas debido a la velocidad del IPC, creo que debería considerar cambiar a memoria compartida en lugar de utilizar una canalización.
Si desea realizar algunas pruebas de velocidad de transferencia, debería probar socat , que es un programa muy versátil que le permite crear casi cualquier tipo de túnel.
fuente
Los mejores resultados que obtendrá con la solución de memoria compartida .
Las tuberías con nombre son solo un 16% mejores que los sockets TCP .
Los resultados se obtienen con la evaluación comparativa de IPC :
Punto de referencia de tubería:
Punto de referencia FIFOs (canalizaciones con nombre):
Punto de referencia de la cola de mensajes:
Punto de referencia de memoria compartida:
Punto de referencia de sockets TCP:
Prueba comparativa de sockets de dominio Unix:
Punto de referencia ZeroMQ:
fuente
Estoy de acuerdo con shodanex, parece que intentas optimizar prematuramente algo que aún no es problemático. A menos que sepa que los sockets van a ser un cuello de botella, simplemente los usaría.
Muchas personas que confían en las tuberías con nombre encuentran un pequeño ahorro (dependiendo de qué tan bien esté escrito todo lo demás), pero terminan con un código que pasa más tiempo bloqueando una respuesta de IPC que haciendo un trabajo útil. Claro, los esquemas sin bloqueo ayudan en esto, pero pueden ser complicados. Pasando años trayendo código antiguo a la era moderna, puedo decir que la aceleración es casi nula en la mayoría de los casos que he visto.
Si realmente cree que los sockets lo ralentizarán, salga por la puerta usando la memoria compartida y preste especial atención a cómo usa las cerraduras. Una vez más, en realidad, es posible que encuentre una pequeña aceleración, pero observe que está desperdiciando una parte esperando bloqueos de exclusión mutua. No voy a defender un viaje al infierno futex (bueno, no todo el infierno más en 2015, dependiendo de su experiencia).
Libra por libra, los sockets son (casi) siempre la mejor manera de obtener el espacio de usuario IPC bajo un kernel monolítico ... y (generalmente) los más fáciles de depurar y mantener.
fuente
Tenga en cuenta que sockets no significa necesariamente IP (y TCP o UDP). También puede utilizar sockets UNIX (PF_UNIX), que ofrecen una mejora notable del rendimiento en comparación con la conexión a 127.0.0.1
fuente
Como a menudo, los números dicen más que sentimiento, aquí hay algunos datos: Pipe vs Unix Socket Performance (opendmx.net) .
Este punto de referencia muestra una diferencia de entre un 12 y un 15% más de velocidad para las tuberías.
fuente
Si no necesita velocidad, ¡los enchufes son la forma más fácil de hacerlo!
Si lo que busca es velocidad, la solución más rápida es la memoria compartida, no las canalizaciones con nombre.
fuente
Para comunicación bidireccional con canalizaciones con nombre:
Las tuberías con nombre son bastante fáciles de implementar.
Por ejemplo, implementé un proyecto en C con canalizaciones con nombre, gracias a la comunicación basada en entrada-salida de archivos estándar (fopen, fprintf, fscanf ...) fue tan fácil y limpio (si eso también es una consideración).
Incluso los codifiqué con java (¡estaba serializando y enviando objetos sobre ellos!)
Las tuberías con nombre tienen una desventaja:
fuente
Un problema con los sockets es que no tienen forma de vaciar el búfer. Existe algo llamado algoritmo de Nagle que recopila todos los datos y los vacía después de 40 ms. Entonces, si se trata de capacidad de respuesta y no de ancho de banda, puede que sea mejor con una tubería.
Puede desactivar Nagle con la opción de socket TCP_NODELAY, pero el final de la lectura nunca recibirá dos mensajes cortos en una sola llamada de lectura.
Así que pruébelo, terminé sin nada de esto e implementé colas basadas en mapas de memoria con pthread mutex y semáforo en la memoria compartida, evitando muchas llamadas al sistema del kernel (pero hoy ya no son muy lentas).
fuente
Las tuberías y enchufes con nombre no son funcionalmente equivalentes; Los sockets proporcionan más funciones (son bidireccionales, para empezar).
No podemos decirle cuál funcionará mejor, pero sospecho que no importa.
Los sockets de dominio Unix harán más o menos lo que los sockets tcp, pero solo en la máquina local y con (quizás un poco) menos gastos generales.
Si un socket Unix no es lo suficientemente rápido y está transfiriendo muchos datos, considere usar memoria compartida entre su cliente y servidor (que es MUCHO más complicado de configurar).
Unix y NT tienen "canalizaciones con nombre" pero son totalmente diferentes en el conjunto de características.
fuente
Puede utilizar una solución ligera como ZeroMQ [ zmq / 0mq ]. Es muy fácil de usar y mucho más rápido que los enchufes.
fuente
nanomsg
. De todos modos, da la bienvenida y disfruta de este gran lugar y conviértete en miembro contribuyente activo.