Actualmente estoy llegando a un límite estricto de 130688 bytes. Si intento enviar algo más grande en un mensaje, recibo un error ENOBUFS.¿Cuál es el tamaño máximo del mensaje del datagrama AF_UNIX que se puede enviar en Linux?
He comprobado las opciones de net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max y net.unix.max_dgram_qlen sysctl y las he aumentado todas pero no tienen ningún efecto porque estos se refieren al tamaño total del búfer, no al tamaño del mensaje.
también han establecido las opciones de conector SO_SNDBUF y SO_RCVBUF, pero esto tiene el mismo problema que el anterior. El tamaño predeterminado del búfer de sockets se establece en función de las opciones de socket _default de todos modos.
He mirado en la fuente del kernel, donde ENOBUFS se devuelve en la pila zócalo, pero no estaba claro para mí donde venía. Los únicos lugares que parecen devolver este error tienen que ver con la imposibilidad de asignar memoria.
es el tamaño máximo de 130688 realidad? Si no, ¿se puede cambiar esto sin volver a compilar el kernel?
Gracias!
Ese es un gran datagrama. En mi opinión, para el momento en que tenga un datagrama tan grande, también podría haber usado TCP. –
Sí, eso no ayuda. Como dije en la publicación, no le permitirá enviar un mensaje más de 130688 independientemente de su configuración de wmem. Los tengo más de 32MB y he probado muchas combinaciones debajo de eso. – Jaime
Solo para agregar a eso. Es una idea errónea de que los buffers de envío y los búferes de recepción son solo para mensajes. El buffer es el buffer total del núcleo para todos los mensajes. Las opciones wmem y qlen sysctl realmente afectarán cómo y cuándo enviar bloques. A medida que el búfer de envío se llena (asumiendo que nadie recibe), cuando el total de bytes en el búfer va más allá del tamaño del búfer o el conteo total va más allá del qlen, el envío se bloqueará. – Jaime