Sockets Linux: copia cero local, TCP / IP remoto

Networking es mi peor área en sistemas operativos, así que perdóname por hacer una pregunta quizás incompleta. He estado leyendo sobre esto durante unas horas, pero está nadando en mi cabeza. (Para mí, siento que el diseño del chip es fácil en comparación con descifrar protocolos de red).

Tengo algunos servicios en red que se comunican entre sí a través de sockets. Específicamente, los sockets se crean confd = socket(PF_INET, SOCK_STREAM, 0);, que obtiene automáticamente TCP / IP. Necesito esto como el caso base, porque estos servicios pueden estar ejecutándose en máquinas separadas.

Pero para un proyecto, estamos tratando de exprimirlos a todos en un 'dispositivo' integrado de baja potencia, basado en un Atom Z530P, por lo que me parece que la sobrecarga de la copia de memoria es algo que podríamos optimizar. He estado leyendo sobre eso aquí: data-link-access-and-zero-copy y Linux_packet_mmap y packet_mmap.

Para este caso, uno crearía el zócalo de esta formfd = socket(PF_PACKET, PF_RAW, 0);. Y hay muchas otras cosas que hacer, como asignar buffers de anillo, mapearlos, asociarlos con el zócalo, etc. Parece que está restringido a usarsendto yrecvfrom para transmitir datos. Según tengo entendido, dado que el socket es local, no necesita un socket confiable de tipo "stream", por lo que los sockets sin procesar son la interfaz adecuada, y yo soyadivinació que el búfer en anillo se usa en la granularidad de la página, donde cada paquete (o datagrama) comienza en un límite de página.

Antes de pasar una gran cantidad de tiempo tratando de investigar esto más a fondo, esperaba que algunas personas útiles pudieran ayudarme con algunas preguntas:

¿Cuántos beneficios de rendimiento debería esperar obtener de los sockets de copia cero? Creo que la última vez que revisé, estábamos moviendo unmáxim de unos 40 MB / seg de un proceso a otro y finalmente al disco. En el escenario más básico, los datos pasan del proceso de captura al proceso de uno a muchos (otros pueden escuchar en la secuencia), al proceso de archivo que escribe en el disco. Son dos saltos sin contar el disco y las cosas internas.Hace Linux algo de esto automáticamente, optimizando los procesos que se ejecutan en la misma máquina? En cualquier caso, tendría tomas de escucha en los puertos TCP. ¿Puedo usarlos para hacer conexiones entre procesos y aún así poder usar copia cero? En otras palabras, ¿puedo usar AF_INET con PF_PACKET?Es PF_PACKET con SOCK_RAW la única configuración válida para sockets de copia cero? ¿Existe algún buen código de muestra que use copia cero con TCP / IP como alternativa? ¿Cuál es la manera más simple o mejor de detectar que los dos procesos están en la misma máquina? Conocen las direcciones IP de cada uno, por lo que podría comparar y usar diferentes rutas de código para cada uno. ¿Hay una manera más simple de hacer esto? ¿Puedo usar write () y read () en un socket basado en paquetes, o son solo válidos para streams? (Reescribir cómo se realizan las conexiones sería más simple que reescribir TODO el código del socket). ¿Estoy complicando demasiado las cosas y / u optimizando las cosas incorrectas? OProfiler me dice que la mayor parte del tiempo de CPU se gasta en dos lugares: (1) zlib y (2) el núcleo, que no puedo perfilar ya que estoy usando CentOS 6.2, que no proporciona un vmlinux. Supongo que el tiempo del kernel es una combinación de tiempo de inactividad y copia de datos y no mucho más.

Gracias de antemano por la ayuda!

Respuestas a la pregunta(4)

Su respuesta a la pregunta