Весь сайт заблокирован, пока одна страница ожидает блокировки (PHP, ASP.NET). Зачем?

Добрый день!

Я нашел интересное поведение как для стека LAMP, так и для ASP.NET.

Сценарий:

За 2-3 минуты выполняется выполнение страницы (создание HttpWebRequest для ASP.NET и завивка для PHP). Хотя эта страница обрабатывается, все остальные запросы к этому виртуальному хосту из одного браузера не обрабатываются (даже если я использую разные браузеры с одной машины). Я использую две страницы, написанные на PHP и C #.

Я тестировал Apache + PHP в режимах mod_php и fast_cgi на Windows и Debian. Для ASP.NET я использую IIS6 (с выделенным пулом приложений для этого сайта и с пулом приложений по умолчанию) и IIS7 в интегрированном режиме.

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

Заранее спасибо!

Solutions Collecting From Web of "Весь сайт заблокирован, пока одна страница ожидает блокировки (PHP, ASP.NET). Зачем?"

Кажется, вы открываете стандартную сессию php, которая открыта до конца запроса. Это означает, что файл сеанса заблокирован. Используйте session_write_close () как можно скорее, если вам уже не нужны данные сеанса.

Я не думаю, что это блокирует сайт; Я бы заподозрил, что открытое соединение блокирует выполнение клиентом большего количества запросов. Вы доказали, что другие машины не могут использовать сайт, пока выполняется ваш долговременный запрос?

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

Блокировка может быть явной (вы написали оператор блокировки) или неявным. Если вы видите несколько запросов – это может быть из-за исчерпания пула потоков.

Имейте в виду, что помимо ограничения количества потоков, используемых для обработки входящих веб-запросов, существует отдельная кепка количества одновременных исходящих веб-запросов через HttpWebRequest, и по умолчанию этот лимит очень низок – если я правильно помню 2 за каждый ЦПУ. Я не помню имя параметра в web.config, но попытаюсь найти его.

В любом случае код публикации даст нам больше шансов помочь вам

Я определенно заметил это поведение при отладке приложений ASP.NET, но я всегда считал, что это проблема с отладочной конфигурацией. Вы строите все в режиме выпуска и отключите отладку в своем web.config?

Приложения ASP.NET имеют глобальную блокировку сеанса.

Используйте EnableSessionState="ReadOnly" для WebForms или [SessionState(SessionStateBehavior.ReadOnly)] для MVC. Это предотвратит блокировку (конечно, вы не можете ничего записать в сеансе только для чтения).

Я просто обнаружил, почему все сайты ASP.Net медленны, и я пытаюсь выяснить, что с этим делать