Я использую IIS на Windows Server 2016 с MySQL и PHP на двух почти идентичных серверах. Недавно я заметил замедление работы одного из двух моих серверов, но это происходит только тогда, когда мой сайт пытается выполнить несколько экземпляров скрипта одновременно. Они как бы прилипают друг к другу.
Прекрасным примером является моя страница поиска. Когда пользователь вводит поисковый запрос, при каждом нажатии клавиши (после второй буквы) выполняется поиск, если с момента последнего нажатия клавиши прошло не менее 200 мс. Поэтому, если вы печатаете быстро, он выполняет только один поиск в конце, но для более медленных печатающих (тех, кто ждет более 200 мс между нажатиями клавиш) это вызовет несколько вызовов результатов поиска. Смотрите этот скриншот.
ПЛОХОЙ СЕРВЕР
Обратите внимание на все ожидающие запросы, и на этом снимке экрана первый из них завершился через 19,08 секунды. Явно слишком долго. К тому времени, когда они все закончат, у них будет более 15 секунд, чтобы вернуть простой набор результатов.
ПЛОХОЙ СЕРВЕР
Имейте в виду, что эти запросы занимают всего доли секунды при запуске в MySQL Workbench, а также при запуске на другом моем сервере, который не страдает от этой проблемы. Посмотрите на этом скриншоте (с хорошего сервера) точно такой же поиск возвращается через четверть секунды.
ХОРОШИЙ СЕРВЕР
Мне кажется, что (на плохом сервере) они не могут выполняться одновременно по какой-то причине, потому что, если я выполняю только один поиск (набрав достаточно быстро, чтобы вызвать только один поиск), он возвращается быстро, но если я выполнить несколько таких, они все застревают, как в пробке. Что может быть причиной этого?
На следующем снимке экрана показан результат, если я запускаю только один поиск на плохом сервере. Как видите, он возвращается очень быстро. Таким образом, проблема возникает только при одновременном выполнении нескольких одинаковых скриптов.
ПЛОХОЙ СЕРВЕР
Недавно я внес некоторые изменения в плохой сервер, но, насколько я помню, единственные изменения, которые я внес, заключались в том, чтобы разрешить загрузку файлов большего размера.
- В PHP я увеличил post_max_size = 500M
- В PHP я увеличил upload_max_filesize = 500M
- В IIS я увеличил UploadReadAheadSize до 49152000.
- В IIS я увеличил максимально допустимую длину содержимого до 300000000.
Возможно, я сделал другие изменения на этом сервере, которые я не могу вспомнить.
ВРЕМЕННОЕ ИСПРАВЛЕНИЕ
Я могу смягчить эту проблему, установив более длительную задержку между нажатиями клавиш при поиске, и я сделал это, увеличив ее до 800 мс, поэтому даже медленно печатающие не видят этой проблемы, но это только временное решение, а не решить основную проблему, которая также влияет на другие области моего сайта.
ЧТО Я ПРОБОВАЛА
До сих пор я подтверждал, что моя конфигурация IIS, конфигурация MySQL (my.ini) и моя конфигурация PHP (php.ini) идентичны во всех отношениях, которые имеют значение на обоих серверах (по крайней мере, насколько это кажется мне очевидным) . Я также подтвердил, что операторы select, которые я запускаю в этом поиске, работают одинаково хорошо на обоих серверах, если я выполняю их в MySQL Workbench. Это только в моем веб-приложении, где у меня есть эта проблема.
На всякий случай я временно отменил два изменения, внесенные в IIS для загрузки больших файлов, но, похоже, это не имело никакого значения.
Я также загрузил и установил LeanSentry, который один или два раза в день предупреждает меня о том, что мой сайт видел заблокированные запросы, что, как я полагаю, именно то, что я вижу здесь, но, к сожалению, LeanSentry может только точно определить источник проблемы с ASP. страницы, а не PHP. Таким образом, это, по сути, только подтверждает для меня, что есть проблема, но больше ничем помочь мне не может.
ДРУГИЕ СИМПТОМЫ
Я вижу похожие проблемы, если одновременно открываю несколько отчетов. Если я позволю завершить загрузку одного отчета перед открытием следующего, все они загружаются быстро, но если я заставлю свое приложение открывать несколько отчетов одновременно, все они зависнут.
Что может быть причиной этой проблемы узкого места?