Как узнать, почему пул приложений IIS перерабатывается

Я думаю, что существует перекрытие между DbC и TDD, однако, я не думаю, там дублирован работа: представление DbC, вероятно, приведет к сокращению тестовых сценариев.

Позволяют мне объяснить.

В TDD, тесты не являются действительно тестами. Они - поведенческие спецификации. Однако они также средства проектирования: путем записи теста сначала, Вы используете внешний API своего объекта под test †“, что Вы на самом деле не записали yet †“таким же образом, что пользователь был бы. Тем путем Вы разрабатываете API способом, который имеет смысл пользователю, а не в пути, который делает самым легким для Вас реализовать. Что-то как queue.full? вместо queue.num_entries == queue.size.

Эта вторая часть не может быть заменена Контрактами.

первая часть может быть частично замененной контрактами, по крайней мере, для модульных тестов. Тесты TDD служат спецификациями поведения, и другим разработчикам (модульные тесты) и специалистам по проблемной области (приемочные испытания). Контракты также определяют поведение, другим разработчикам, специалистам по проблемной области, но также и к компилятору и библиотеке времени выполнения.

, Но контракты зафиксировали гранулярность: у Вас есть метод пред - и постусловия, объектные инварианты, контракты модуля и так далее. Возможно, варианты цикла и инварианты. Модульные тесты однако, тестовые единицы поведения. Те могли бы быть меньшими, чем метод или состоять из нескольких методов. Это не что-то, что можно сделать с контрактами. И для "большого изображения" Вам все еще нужны интеграционные тесты, функциональные испытания и приемочные испытания.

И существует другая важная часть TDD, который не покрывает DbC: середина D. В TDD, тесты диск Ваш процесс разработки: Вы никогда не пишете одну строку кода реализации, если у Вас нет провального теста, Вы никогда не пишете одну строку тестового кода, если Ваши тесты вся передача, Вы только не пишете минимальную сумму кода реализации для создания тестовой передачи, Вы только пишете минимальную сумму тестового кода для создания провального теста.

В заключении: используйте тесты для разработки "потока", "чувства" API. Используйте контракты для разработки, ну, в общем, контракт API. Используйте тесты для обеспечения "ритма" для процесса разработки.

Что-то вроде этого:

  1. Запись приемочное испытание для функции
  2. Запись модульный тест на единицу, которая реализует часть той функции
  3. Используя сигнатуру метода, которую Вы разработали на шаге 2, запишите, что прототип метода
  4. Добавляет, что постусловие
  5. Добавляет Реализацию предварительного условия
  6. тело метода
  7. , Если приемочное испытание передает, goto 1, иначе goto 2

, Если Вы хотите знать то, что Bertrand Meyer, изобретатель Дизайна Контракта, думает об объединяющемся TDD, и DbC, существует хорошая статья его группы, названной Управляемый Контрактом Дизайн = Разработка через тестирование - Пишущий Тесты . Основная предпосылка - то, что контракты предоставляют абстрактное представление всех возможных случаев, тогда как тестовые сценарии только тестируют конкретные случаи. Поэтому подходящая тестовая обвязка может быть автоматически сгенерирована из контрактов.

17
задан Drew Noakes 26 March 2011 в 15:39
поделиться

2 ответа

Исследования - 1

Сначала я попытался использовать System.Web.ProcessModelInfo.GetCurrentProcessInfo() и System.Web.ProcessModelInfo.GetHistory(int). Результаты этих методов возвращают информацию, такую ​​как PID, время начала, возраст, состояние и пиковое использование памяти. К сожалению, они были недоступны в моей хостинговой среде:

HttpException 0x80004005 - Метрики процессов доступны только при включенной модели процессов ASP.NET. При работе на версиях IIS 6 или новее в режиме изоляции рабочих процессов эта функция не поддерживается.

Этот подход может работать для других, хотя, если вы находитесь в такой ситуации, попробуйте.

Исследования - 2

Свойство System.Web.Hosting.HostingEnvironment.ShutdownReason является перечислением с большим количеством значений, но, к сожалению, все описанные в моем вопросе случаи объединены в одно значение перечисления:

ApplicationShutdownReason.HostingEnvironment: среда хостинга закрыла домен приложения.

Исследования - 3

У ScottGu есть подход в своем блоге (это тот же код , который Кев опубликовал ), который использует отражение для Доступ к внутреннему состоянию HttpApplication. К сожалению, в этом случае он сообщает только ту же деталь, что и № 2 выше:

_shutDownMessage =
  HostingEnvironment initiated shutdown
  HostingEnvironment caused shutdown

_shutDownStack =
  at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
  at System.Environment.get_StackTrace()
  at System.Web.Hosting.HostingEnvironment.InitiateShutdownInternal()
  at System.Web.Hosting.HostingEnvironment.InitiateShutdownWithoutDemand()
  at System.Web.Hosting.PipelineRuntime.StopProcessing()
7
ответ дан 30 November 2019 в 13:11
поделиться

Это действительно поздний ответ, но я надеюсь, что он может дать дополнительное понимание тем, у кого есть похожие проблемы (IIS 7.x или выше).

1. Поиск, когда пул приложений начинает закрываться - следующий код можно использовать, чтобы узнать, когда пул приложений начинает свое отключение. Фактическое отключение происходит в максимальном пределе отключения (секунды, по умолчанию 90) после этого события.

public class ApplicationPoolService : IApplicationPoolService
{
    public bool IsShuttingDown()
    {
        return System.Web.Hosting.HostingEnvironment.ShutdownReason != ApplicationShutdownReason.None;
    }

    public ApplicationShutdownReason GetShutdownReason()
    {
        return System.Web.Hosting.HostingEnvironment.ShutdownReason;
    }
}

public class HostingEnvironmentRegisteredObject : IRegisteredObject
{
    public void Stop(bool immediate)
    {
        // second call is done when the Stop is imminent 
        if (immediate)
            return;

        var reason = appPoolService.GetShutdownReason().ToString();
        logger.Log(LogLevel.Info, $"HostingEnvironmentRegisteredObject.stop called with shutdown reason {reason}");
    }
}

// this code should be placed in global.asax.cs
protected void Application_Start()
{
    HostingEnvironment.RegisterObject(new HostingEnvironmentRegisteredObject());
}

Это помогает найти общую причину и точно, когда это было вызвано. В вашем случае, я думаю, HostingEnvironment это значение. К сожалению, первопричина не уникальна. Это может быть периодическая переработка, перезапуск из-за ограничения памяти (наиболее вероятная причина в вопросе OP), перезапуск из-за фиксированного часа и т. Д.

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

  • Точное время начала выключения
  • Фильтр журнала событий:
    • Источники событий = WAS
    • Уровень события = информация
    • Записано = пользовательское диапазон, включающий точное время отключения +/- 1 минута или около того

Журнал событий должен возвращать более важную информацию, как показано ниже:

A рабочий процесс с идентификатором процесса «xxx», обслуживающий пул приложений «xxx», запросил перезапуск, поскольку достиг запланированного времени перезапуска.


Рабочий процесс с идентификатором процесса «xxx», обслуживающий пул приложений «xxx», запросил перезапуск, поскольку достиг своего предела виртуальной памяти.

3
ответ дан 30 November 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: