Con el ejemplo anterior obtengo un tiempo de ida y vuelta de ~ 65μsec. Si hago dos fifos en el sistema de archivos, esto se reduce a ~ 45 μsec. El tiempo adicional que usa los sockets de localhost debe ser porque estoy llegando a la pila de la red.
Sí, y eso es de esperar.
Los FIFO son un método de comunicación bastante primitivo. Su estado es esencialmente una variable bool. Las lecturas y escrituras pasan por el mismo búfer preasignado de tamaño fijo. Por lo tanto, el sistema operativo puede optimizar y optimiza las operaciones.
Los zócalos son más complejos. Tienen una máquina de estado de TCP completa. El almacenamiento en búfer es dinámico y bidireccional (recv, send se almacenan en búfer por separado). Eso significa que cuando escribes algo en el socket local, casi siempre tienes algún tipo de administración de memoria dinámica involucrada. Linux trata de evitar eso tanto como sea posible: se implementan trucos de copia cero/copia única por todas partes. Sin embargo, obviamente, dado que las llamadas tienen que pasar por más código, serían más lentas.
Al final, teniendo en cuenta la cantidad de sockets que se comparan con los FIFO, 20us de diferencia es, francamente, una afirmación sobre lo bueno que es el rendimiento del socket de Linux.
P.S. 65us rtt = ~ 35us en una dirección. 1s/35us = ~ 30K paquetes por segundo. Para código de red sin optimizaciones usando una sola conexión que suena bien.
¿Está usando un núcleo basado en 2.4? Eso es parte del problema. –
Sí, también uso un tocadiscos;) ¿Sabe si la versión posterior del kernal optimizará el tráfico de la red local de forma diferente? – Jonathan
Probablemente no, ¿podría explicar por qué no es adecuado usar tubos con nombre? ¿Has probado usar UDP en lugar de TCP? (DatagramSocket) – Ivan