8.4.2. Cola de socket
A diferencia de la cola de hardware de NIC, la cola de socket es llenada por la pila de red desde el contexto
softirq
. Luego, las aplicaciones drenan las colas de los sockets correspondientes mediante llamadas a read
, recvfrom
, y similares.
Para monitorizar el estatus de esta cola, use la herramienta
netstat
; la columna Recv-Q
muestra el tamaño de la cola. En general, la exceso de ejecución en la cola del socket se administra en la misma forma que los excesos de ejecución de búfer de hardware de NIC (e.j. Sección 8.4.1, “Búfer de hardware de NIC”):
- Tráfico de entrada
- La primera opción es disminuir el tráfico de entrada al configurar la tasa en la cual se llena la cola. Para hacerlo, puede filtrar marcos o prevaciarlos. También puede retardar el tráfico de entrada al disminuir el peso de dispositivos[6].
- Profundidad de cola
- También puede evitar que la cola se exceda al aumentar la profundidad de cola. Para hacerlo, aumente el valor del parámetro de kernel
rmem_default
o la opción de socketSO_RCVBUF
. Para mayor información, consulte la Sección 8.2, “Parámetros de redes optimizadas”. - Frecuencia de llamada de aplicación
- Cuando sea posible, optimice la aplicación para realizar llamadas de una forma más frecuente. Esto implica modificar o reconfigurar la aplicación de redes para realizar más llamadas POSIX (tales como
recv
,read
). A su vez, esto permite a una aplicación drenar la cola de una forma más rápida.
Para muchos administradores, el aumento de la profundidad de cola es la solución preferida. Aunque es la solución más fácil, no siempre es la que funciona a largo plazo. Como las tecnologías de redes se tornan más rápidas, las colas de sockets se llenarán de una forma más rápida. Con el tiempo, esto significa tener que reajustar la profundidad de la cola como corresponda.
La mejor solución es mejorar o configurar la aplicación para drenar los datos del kernel de una forma más rápida, incluso si esto significa poner en cola los datos en espacio de aplicaciones. Así se pueden almacenar datos de una forma más flexible, ya que se puede intercambiar y revertir cuando sea necesario.
[6]
El peso de dispositivos se controla mediante
/proc/sys/net/core/dev_weight
. Para obtener mayor información sobre el peso de dispositivos y las implicaciones de su ajuste, consulte la Sección 8.4.1, “Búfer de hardware de NIC”.