ASP. NET MVC запрос зависает, когда ОЗУ относительно мало - PullRequest
1 голос
/ 04 февраля 2020

Я застрял со следующей загадочной проблемой при использовании ASP. NET MVC и IIS. У меня очень простой контроллер:

public class SimpleController : Controller
{
    public ActionResult Huge()
    {
        return Content(new string('a', 3000000));
    }

    public ActionResult Small()
    {
        return Content(new string('a', 1000000));
    }
}

Если я запускаю этот пример с IIS Express или более сложные примеры с обычным IIS, чем я иногда сталкиваюсь с проблемой, этот запрос к обработчику метода /Huge просто зависает: в браузере, это похоже на бесконечную загрузку страницы, в Wireshark я видел, что TCP-соединение открылось, но после этого нет активности с сервера (я также пытаюсь делать необработанные запросы с python через requests lib и в этот случай также зависает для /Huge обработчика метода). С другой стороны, запросы к обработчику метода /Small работают нормально.

Я обнаружил, что это поведение стабильно воспроизводится с относительно небольшим объемом свободной оперативной памяти. Но для меня это очень странно: Process Explorer показывает, что доступно не менее 8 ГБ ОЗУ (проблема воспроизводится, когда доступно менее 8 ГБ свободного места, но при большем объеме оба этих контроллера работают нормально)

Я также попытайтесь воспроизвести это поведение с ASP NET Core и сервером Kestrel, и с этой настройкой все работает нормально, и никаких зависаний не произошло.

Кто-нибудь может пролить свет на эту загадочную проблему? В чем причина проблемы и есть ли обходные пути?

Мои конфигурации следующие:

  • . NET Framework 4.8
  • Windows 10 Pro (версия 1909)
  • ОЗУ: 32 ГБ (с включенным свопом фиксированного размера - 24 ГБ)
  • Сервер: Microsoft-IIS / 10.0

1 Ответ

1 голос
/ 04 февраля 2020

Я копаю немного глубже и обнаружил ошибки в файлах журнала HTTP.sys (C:\Windows\System32\LogFiles\HTTPERR\httperr1.log). Произошла ошибка для запроса со следующим тегом: Connection_Abandoned_By_ReqQueue. Эта информация помогает мне найти в блоге сообщение о схожей проблеме: https://mvolo.com/low-pagefile-can-cause-503-service-unavailable-on-azure-web-roles/

Предлагаемое решение заключается в увеличении размера свопа. Я делаю это (увеличьте объем подкачки на 64 ГБ, чтобы IIS был доволен им) - и проблема решена

В любом случае, я не понимаю, что не так с IIS и почему он может ' я не использую доступную память в моей первоначальной настройке (Kestrel в ASP NET Ядро может обрабатывать запросы, и я пишу фиктивное приложение, которое просто выделяет некоторую память - 5-8 ГБ - и все работает отлично)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...