¿Qué podría causar solicitudes bloqueadas en IIS?

¿Qué podría causar solicitudes bloqueadas en IIS?

Estoy usando IIS en Windows Server 2016 con MySQL y PHP en dos servidores casi idénticos. Recientemente noté una desaceleración en uno de mis dos servidores, pero ocurre solo cuando mi sitio intenta ejecutar varias instancias de un script al mismo tiempo. Parecen quedarse atrapados el uno en el otro.

Un ejemplo perfecto es mi página de búsqueda. Cuando el usuario escribe una consulta de búsqueda, con cada pulsación de tecla (después de la segunda letra) se ejecuta una búsqueda siempre que haya al menos un retraso de 200 ms desde la última pulsación de tecla. Entonces, si escribe rápido, solo realiza una búsqueda al final, pero para los que escriben más lentamente (aquellos que esperan más de 200 ms entre pulsaciones de teclas), esto activará múltiples llamadas a los resultados de la búsqueda. Vea esta captura de pantalla.

MAL SERVIDOR ingrese la descripción de la imagen aquí

Observe todas las solicitudes pendientes y en esta captura de pantalla la primera acaba de finalizar en 19,08 segundos. Obviamente demasiado tiempo. Cuando hayan terminado, habrán pasado más de 15 segundos para devolver un conjunto de resultados simple.

MAL SERVIDOR ingrese la descripción de la imagen aquí

Tenga en cuenta que estas consultas tardan sólo una fracción de segundo cuando se ejecutan en MySQL Workbench y también cuando se ejecutan en mi otro servidor que no sufre este problema. Vea en esta captura de pantalla (del buen servidor) exactamente la misma búsqueda devuelve en un cuarto de segundo.

BUEN SERVIDOR ingrese la descripción de la imagen aquí

Me parece que (en el servidor defectuoso) no pueden ejecutarse simultáneamente por alguna razón porque si ejecuto solo una búsqueda (escribiendo lo suficientemente rápido para activar solo una búsqueda) vuelve rápido, pero si Si ejecutas múltiples como este, todos se quedan atascados como en un atasco. Que podria causar esto?

La siguiente captura de pantalla muestra el resultado si activo solo una búsqueda en el servidor defectuoso. Como puedes ver, vuelve súper rápido. Entonces, el problema solo surge cuando se ejecutan varios del mismo script simultáneamente.

MAL SERVIDOR ingrese la descripción de la imagen aquí

Hice algunos cambios en el servidor defectuoso recientemente, pero hasta donde puedo recordar, los únicos cambios que hice fueron para permitir cargas de archivos más grandes.

  • En PHP aumenté post_max_size = 500M
  • En PHP aumenté upload_max_filesize = 500M
  • En IIS aumenté UploadReadAheadSize a 49152000
  • En IIS aumenté la longitud máxima permitida del contenido a 300000000

Es posible que haya realizado otros cambios en este servidor que no recuerdo.

ARREGLO TEMPORAL

Puedo mitigar este problema permitiendo un retraso más largo entre las pulsaciones de teclas durante la búsqueda, y lo he hecho, incrementándolo a 800 ms para que incluso los que escriben lentamente no vean este problema, pero esto es sólo una solución curita y no abordar el problema subyacente que también afecta a otras áreas de mi sitio.

LO QUE HE PROBADO

Hasta ahora he confirmado que mi configuración de IIS, configuración de MySQL (my.ini) y mi configuración de PHP (php.ini) son todas idénticas en todos los aspectos importantes en ambos servidores (al menos en lo que me parece obvio) . También confirmé que las declaraciones de selección que estoy ejecutando en esta búsqueda funcionan igualmente bien en ambos servidores si las ejecuto en MySQL Workbench. Solo en mi aplicación web tengo este problema.

Deshice temporalmente los dos cambios que hice en IIS para cargar archivos más grandes por si acaso, pero eso no pareció hacer ninguna diferencia.

También descargué e instalé LeanSentry, que me advierte una o dos veces al día que mi sitio ha visto solicitudes bloqueadas, lo cual supongo que es exactamente lo que estoy viendo aquí, pero desafortunadamente LeanSentry solo puede identificar el origen del problema con ASP. páginas, no PHP. Básicamente, solo me confirma que hay un problema, pero no puede ayudarme más allá de eso.

OTROS SÍNTOMAS

Veo problemas similares si abro varios informes simultáneamente. Si dejo que un informe termine de cargarse antes de abrir el siguiente, todos se cargan rápidamente, pero si fuerzo a mi aplicación a abrir varios informes a la vez, todos se atascan.

¿Qué podría estar causando este problema de cuellos de botella?

Respuesta1

Creo que no es el servidor IIS el que tiene problemas aquí, cada cosa que busca solicita una nueva llamada en su código, y parece que algo dentro de su script PHP está tardando mucho tiempo.

Cada vez que envía una nueva solicitud, simplemente bloquea nuevos instantes de PHP, y cuando PHP se queda sin instantes, falla.

Es difícil saber qué está haciendo dentro de su archivo PHP de búsqueda, pero creo que está llamando a algún servidor SQL o algo así para buscar. ¿Puedes intentar comentar la consulta de búsqueda dentro del código y hacer la misma prueba?

En este momento, supongo que es lo mejor que puedo, suena como si estuvieras usando una expresión regular o una función similar en tu base de datos SQL, y cuando tienes muchas filas es extremadamente lento hacer una llamada, por eso se cuelga mucho.

Pero nuevamente supongo que tan tarde sabré el resultado de la prueba que te digo que hagas.

Respuesta2

Resulta que la representación HTML estaba provocando el bloqueo. Cuando los resultados de mi búsqueda eran largos, el navegador tardaba mucho en representar todo el HTML y, mientras lo hacía, no podía procesar la siguiente solicitud.

Resolví el problema limitando los resultados de la búsqueda a 50 filas, por lo que ahora el HTML se procesa casi instantáneamente y se puede ejecutar la siguiente solicitud. Entonces no era IIS el que bloqueaba las solicitudes, sino el navegador.

información relacionada