Tenemos un par de sistemas de producción que se convirtieron recientemente en máquinas virtuales. Hay una aplicación nuestra que frecuentemente accede a una base de datos MySQL, y para cada consulta crea una conexión, consulta y desconecta esa conexión.
No es la forma apropiada de consultar (lo sé), pero tenemos restricciones que parece que no podemos evitar. De todos modos, el problema es este: mientras que la máquina era un host físico, el programa funcionó bien. Una vez convertido a una máquina virtual, notamos problemas de conexión intermitente a la base de datos. Hubo, en un momento, más de 24000 conexiones de socket en TIME_WAIT (en el host físico, lo más que vi fue 17000, no es bueno, pero no causa problemas).
Me gustaría que estas conexiones se reutilicen, para que no veamos ese problema de conexión, y así:
Preguntas:
¿Está bien establecer el valor de tcp_tw_reuse en 1? ¿Cuáles son los peligros obvios? ¿Hay alguna razón por la que nunca debería hacerlo?
Además, ¿hay alguna otra forma de obtener el sistema (RHEL / CentOS) para evitar que tantas conexiones entren en TIME_WAIT o que se reutilicen?
Por último, ¿qué haría cambiar tcp_tw_recycle, y eso me ayudaría?
De antemano, gracias!
Respuestas:
Puede reducir el tiempo de inactividad de manera segura, pero puede encontrarse con problemas con conexiones cerradas incorrectamente en redes con pérdida de paquetes o fluctuación de fase. No comenzaría a sintonizar a 1 segundo, comenzaría a las 15-30 y seguiría bajando.
Además, realmente necesita arreglar su aplicación.
RFC 1185 tiene una buena explicación en la sección 3.2:
fuente
Esto no responde a su pregunta (y tiene 18 meses de retraso), pero sugiere otra forma de hacer que su aplicación heredada reutilice puertos:
Una alternativa útil a la configuración
tcp_tw_reuse
(otcp_tw_recycle
) en el sistema es insertar una biblioteca compartida (usandoLD_PRELOAD
) en su aplicación; esa biblioteca puede permitir la reutilización del puerto. Esto hace que su aplicación heredada permita la reutilización de puertos sin forzar esto en todas las aplicaciones en su sistema (no se requiere modificación de su aplicación), lo que limita el impacto de su ajuste. Por ejemplo,Esta biblioteca compartida debe interceptar la
socket()
llamada, llamar al socket real () y establecer SO_REUSEADDR y / o SO_REUSEPORT en el socket devuelto. Mire http://libkeepalive.sourceforge.net para ver un ejemplo de cómo hacer esto (esto activa keepalives, pero activar SO_REUSEPORT es muy similar). Si su aplicación legado comportado mal utiliza IPv6, recuerde que debe cambiar la línea 55 delibkeepalive.c
dea
Si está atascado, envíeme un correo electrónico y escribiré el código y se lo enviaré.
fuente
Creo que está bien cambiar este valor a 1. Una forma más apropiada podría ser usar el comando:
No conozco ningún peligro obvio, pero una búsqueda rápida en Google produce este enlace que afirma que
tcp_tw_reuse
es la mejor alternativa quetcp_tw_recycle
, pero debe usarse con precaución independientemente.fuente
La conexión no se puede reutilizar si están en TIME WAIT. Si no tiene pérdida de paquetes en la red entre la aplicación y MySQL, puede reducir el tiempo de espera.
Sin embargo, la mejor solución es usar conexiones persistentes hacia la base de datos y un grupo de conexiones.
fuente