Что может стать причиной блокировки запросов в IIS?

Что может стать причиной блокировки запросов в IIS?

Я использую 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. Так что по сути он только подтверждает мне, что проблема есть, но не может мне помочь больше.

ДРУГИЕ СИМПТОМЫ

Я вижу похожие проблемы, если открываю несколько отчетов одновременно. Если я позволяю одному отчету завершить загрузку перед тем, как открыть следующий, они все загружаются быстро, но если я заставляю свое приложение открыть несколько отчетов одновременно, они все зависают.

Что может быть причиной этой проблемы?

решение1

Я думаю, что проблема не в сервере IIS, каждый раз, когда вы что-то ищете, вы запрашиваете новый вызов в своем коде, и похоже, что что-то внутри вашего PHP-скрипта выполняет свою работу очень долго.

Каждый раз, когда вы отправляете новый запрос, вы просто блокируете новые PHP-инстанты, а когда PHP исчерпывает все свои инстанты, происходит сбой.

Трудно понять, что вы делаете внутри вашего поискового PHP-файла, но я думаю, что вы обращаетесь к какому-то SQL-серверу или чему-то еще для поиска. Можете ли вы попробовать закомментировать поисковый запрос внутри кода и провести тот же тест?

Сейчас я просто пытаюсь предположить, что могу сделать. Похоже, вы используете что-то вроде регулярного выражения или функции в своей базе данных SQL, а когда у вас много строк, выполнение вызова происходит крайне медленно, поэтому он часто зависает.

Но опять же, я просто предполагаю, что так поздно узнаю результат теста, который я вам говорю сделать.

решение2

Оказывается, причиной зависания был рендеринг HTML. Когда результаты моего поиска были длинными, браузеру требовалось много времени, чтобы отобразить весь HTML, и пока он это делал, он не мог обработать следующий запрос.

Я решил проблему, ограничив результаты поиска 50 строками, так что теперь HTML отображается почти мгновенно, и следующий запрос может быть выполнен. Так что это не IIS блокировал запросы, а браузер.

Связанный контент