Estou usando o IIS no Windows Server 2016 com MySQL e PHP em dois servidores quase idênticos. Recentemente notei uma lentidão em um dos meus dois servidores, mas isso acontece apenas quando meu site tenta executar várias instâncias de um script ao mesmo tempo. Eles parecem ficar presos um no outro.
Um exemplo perfeito é minha página de pesquisa. Quando o usuário digita uma consulta de pesquisa, a cada tecla pressionada (após a segunda letra) uma pesquisa é executada desde que haja um atraso de pelo menos 200 ms desde o último pressionamento de tecla. Portanto, se você digitar rápido, ele fará apenas uma pesquisa no final, mas para digitadores mais lentos (aqueles que esperam mais de 200 ms entre os pressionamentos de teclas), isso acionará várias chamadas para os resultados da pesquisa. Veja esta captura de tela.
Observe todas as solicitações pendentes e nesta captura de tela a primeira terminou aos 19,08 segundos. Obviamente, muito tempo. Quando tudo terminar, terão mais de 15 segundos para retornar um conjunto de resultados simples.
Tenha em mente que essas consultas levam apenas uma fração de segundo quando executadas no MySQL Workbench e também quando executadas em meu outro servidor que não está sofrendo deste problema. Veja nesta captura de tela (do servidor bom) exatamente a mesma pesquisa retorna em um quarto de segundo.
Parece-me que (no servidor ruim) eles não são capazes de executar simultaneamente por algum motivo, porque se eu executar apenas uma única pesquisa (digitando rápido o suficiente para acionar apenas uma única pesquisa), ela retornará rapidamente, mas se eu executar múltiplos como este, todos ficarão presos como num engarrafamento. O que poderia causar isso?
A próxima captura de tela mostra o resultado se eu acionar apenas uma única pesquisa no servidor inválido. Como você pode ver, ele volta super rápido. Portanto, o problema ocorre apenas ao executar múltiplos do mesmo script simultaneamente.
Fiz algumas alterações no servidor ruim recentemente, mas até onde me lembro, as únicas alterações que fiz foram para permitir uploads de arquivos maiores.
- Em PHP aumentei post_max_size = 500M
- Em PHP aumentei upload_max_filesize = 500M
- No IIS aumentei UploadReadAheadSize para 49152000
- No IIS, aumentei o comprimento máximo permitido do conteúdo para 300000000
É possível que eu tenha feito outras alterações neste servidor das quais não me lembro.
REPARO PROVISÓRIO
Posso mitigar esse problema permitindo um atraso maior entre os pressionamentos de teclas durante a pesquisa, e fiz isso, aumentando para 800 ms para que mesmo digitadores lentos não vejam esse problema, mas esta é apenas uma solução band-aid e não abordar o problema subjacente que também afeta outras áreas do meu site.
O QUE EU TENTEI
Até agora eu confirmei que minha configuração do IIS, configuração do MySQL (my.ini) e minha configuração do PHP (php.ini) são todas idênticas em todos os aspectos importantes em ambos os servidores (pelo menos no que parece óbvio para mim) . Também confirmei que as instruções select que estou executando nesta pesquisa funcionam igualmente bem em ambos os servidores se eu as executar no MySQL Workbench. É apenas no meu aplicativo da web que estou tendo esse problema.
Desfiz temporariamente as duas alterações que fiz no IIS para uploads de arquivos maiores, apenas para garantir, mas isso pareceu não fazer diferença.
Também baixei e instalei o LeanSentry, que me avisa uma ou duas vezes por dia que meu site viu solicitações bloqueadas, o que presumo ser exatamente o que estou vendo aqui, mas infelizmente o LeanSentry só consegue identificar a origem do problema com ASP páginas, não PHP. Basicamente, isso apenas confirma para mim que há um problema, mas não pode me ajudar além disso.
OUTROS SINTOMAS
Vejo problemas semelhantes se eu abrir vários relatórios simultaneamente. Se eu permitir que um relatório termine de carregar antes de abrir o próximo, todos eles serão carregados rapidamente, mas se eu forçar meu aplicativo a abrir vários relatórios de uma vez, todos eles ficarão presos.
O que poderia estar causando esse problema de gargalo?
Responder1
Acho que não é o servidor IIS que tem problemas aqui, cada coisa que você pesquisa você solicita uma nova chamada no seu código, e parece que algo dentro do seu script PHP está demorando muito.
Cada vez que você envia uma nova solicitação você apenas bloqueia novos instantes do PHP, e quando o PHP está ficando sem instantes ele trava.
É difícil saber o que você está fazendo dentro do seu arquivo PHP de pesquisa, mas acho que você está ligando para algum servidor SQL ou algo para pesquisar. Você pode tentar comentar a consulta de pesquisa dentro do código e fazer o mesmo teste?
No momento, acho que o melhor que posso, parece que você está usando um regex ou uma função semelhante em seu banco de dados SQL, e quando você tem muitas linhas, é extremamente lento para fazer uma chamada, por isso trava muito.
Mas, novamente, acho que é tarde demais para saber o resultado do teste que mando você fazer.
Responder2
Acontece que a renderização do HTML estava causando o travamento. Quando meus resultados de pesquisa eram longos, demorava muito para o navegador renderizar todo o HTML e, enquanto fazia isso, não conseguia processar a próxima solicitação.
Resolvi o problema limitando os resultados da pesquisa a 50 linhas, para que agora o HTML seja renderizado quase instantaneamente e a próxima solicitação possa ser executada. Portanto, não era o IIS que estava bloqueando as solicitações, mas sim o navegador.