La aplicación se ralentiza (A VECES) en las horas pico, se ejecuta en Tomcat con un proxy inverso del servidor Apache, implementado en AWS

La aplicación se ralentiza (A VECES) en las horas pico, se ejecuta en Tomcat con un proxy inverso del servidor Apache, implementado en AWS

Solo como prefacio: soy desarrollador de software y al principio nadie sabía lo que estaba pasando, así que hice algunas pruebas y leí, y me gustaría ayudar a mis colegas a solucionar este problema.

La cuestión:

El problema es que en las horas pico, el servidor se vuelve tan lento que la conexión se agota en navegadores como Chrome (después de 30 segundos), pero el servidor aún está activo y puede servir páginas después de ~100 segundos (probado con insomnio). Repliqué el problema abs ...en el servidor de producción y tiene algo que ver con la cantidad de solicitudes simultáneas, probablemente causadas por nuestra configuración del servidor Apache.

Más información:

Durante el desarrollo ejecutamos tomcat8 localmente, lo probé con " abs -c 200 -n 2000 https:/[link]" y los tiempos de ejecución están bien. Pero al probar el servidor de producción, incluso con 50 solicitudes simultáneas, la desaceleración de la API que estaba probando fue significativa: de 800 ms de tiempo predeterminado a 27846 ms.

Cosas probadas y más detalles:

Tenemos Java Melody ejecutándose y pensé que tal vez estábamos alcanzando el límite de subprocesos en el subproceso de ejecución de Tomcat, por lo que aumentamos la cantidad de subprocesos a 500 desde el valor predeterminado de 200 (esto fue antes de realizar la prueba). Al ejecutar la prueba antes mencionada, puedo ver que los subprocesos ocupados aumentan a 50 y tantos de 500 (se ejecutan en producción, por lo que algunas personas también están usando el programa), pero no, todavía se ralentiza mucho.

En las horas pico, veo que tenemos alrededor de 1000 sesiones http, pero los subprocesos, la memoria y la CPU no están ni cerca del 100%. Sólo para asegurarnos de que actualizamos el servidor al mejor que podamos, pero, por supuesto, eso no fue todo. Estamos usando SQL, pero el servidor SQL tampoco alcanza su punto máximo, así que dudo que ese sea el problema.

Sé que no debería imitar los argumentos de JVM, pero al observar problemas similares, intenté agregar "-XX:ReservedCodeCacheSize=512M" pero tampoco funcionó. También intenté aumentar AcceptCount a 1000 en server.xml, pero todavía no funciona.¿Debo revertir estos cambios?No he notado ningún cambio en el rendimiento y, por lo que puedo ver al leer la documentación, está bien dejarlo así.

Tenemos una característica extraña en la que la aplicación web va a la página de inicio después de un tiempo de inactividad y luego sigue actualizando la página de inicio cada xx minutos. Creo que esto es malo para el rendimiento, especialmente si un usuario tiene muchas pestañas abiertas y comienzan a actualizarse, probablemente no sea la causa de nuestros problemas, pero vale la pena mencionarlo.

Lo siguiente que intentaré hoy es alterar los argumentos del servidor Apache. estoy leyendo unguía de sintonizacióny MaxRequestWorkers/MaxClients parece algo que podría explicar lo que estamos experimentando. CitaSi esta directiva es demasiado baja, Apache subutiliza el hardware disponible, lo que se traduce en dinero desperdiciado y largos retrasos en los tiempos de carga de la página durante las horas pico.

Agradecería cualquier consejo. Con suerte, es solo el servidor Apache y al menos puedo hacer que el servidor sea utilizable hoy. ¿Alguna otra configuración que pueda causar esta desaceleración?

Respuesta1

Es posible que su servidor web se esté ahogando con demasiadas solicitudes, lo que de hecho emula el ataque DOS de SlowLoris, consulte mirespuesta anterioren el tema.

información relacionada