Почему новый домен приложений создается каждые несколько секунд (WCF / IIS 7)? - PullRequest
2 голосов
/ 24 января 2012

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

Каждая строка ниже записывается примерно из следующей трассировки стека:

AddItem (WCF service method)
calls SomeRepositoryClass.Open (instance of class was created for this request)
calls WritePlanBufferManager constructor (static instance), accessed in lock construct (on static readonly object field)

Log (A = AppDomain.CurrentDomain.Id, T = Thread.CurrentThread.ManagedThreadId):

    Line 1: [21:21:21.7544122 A:002 T:011] Created new WritePlanBufferManager for appdomain 2
    Line 2: [21:21:31.0299427 A:004 T:008] Created new WritePlanBufferManager for appdomain 4
    Line 3: [21:21:36.5912608 A:006 T:012] Created new WritePlanBufferManager for appdomain 6
    Line 4: [21:21:37.9533387 A:008 T:010] Created new WritePlanBufferManager for appdomain 8
    Line 670: [21:21:41.1065191 A:010 T:020] Created new WritePlanBufferManager for appdomain 10
    Line 1336: [21:21:43.4236516 A:012 T:020] Created new WritePlanBufferManager for appdomain 12
    Line 2002: [21:21:45.8347895 A:014 T:020] Created new WritePlanBufferManager for appdomain 14
    Line 2656: [21:21:48.2479276 A:016 T:020] Created new WritePlanBufferManager for appdomain 16
    Line 3322: [21:21:50.9600827 A:018 T:020] Created new WritePlanBufferManager for appdomain 18
    Line 3988: [21:21:53.2752151 A:020 T:010] Created new WritePlanBufferManager for appdomain 20
    Line 4654: [21:21:55.7353558 A:022 T:020] Created new WritePlanBufferManager for appdomain 22
    Line 5320: [21:21:58.0414877 A:024 T:007] Created new WritePlanBufferManager for appdomain 24
    Line 5984: [21:22:00.5546315 A:026 T:020] Created new WritePlanBufferManager for appdomain 26
    Line 6650: [21:22:02.9327675 A:028 T:020] Created new WritePlanBufferManager for appdomain 28
    Line 7316: [21:22:05.4109092 A:030 T:020] Created new WritePlanBufferManager for appdomain 30
    ....many more

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

Каждый из этих WritePlanBufferManager объектов используется для создания нескольких (~ 13) потоков для отложенных / асинхронных очередей и обработки элементов.

Конфигурация службы является стандартным, минимальным, внешнимиз коробки.Web.config практически пуст и не имеет конфигурации WCF.

Пул приложений имеет максимальное количество рабочих процессов = 1, защита от быстрого отказа / запуск / выключение / Ping все отключены.Служба забита запросами от одного клиента, одного потока.

Итак, основной вопрос - почему я получаю несколько доменов приложений, почему часто создаются дополнительные домены приложений?


Обновление : создается впечатление, что мои домены приложений выгружаются и все потоки прерываются через несколько секунд (около одной минуты).Однако в пуле приложений нет ограничений по процессору, время простоя составляет несколько дней, 1 максимальный рабочий процесс, Ping отключен (и время ожидания установлено на несколько дней), защита от быстрой защиты от сбоев отключена, а все параметры повторного использования процессов отключены.

Итак, возникает вопрос, почему выгружаются мои AppDomain (ы) - ничего в журнале событий - и как таковые мои потоки прерываются?

1 Ответ

1 голос
/ 24 января 2012

Похоже, что ваш сервис InstanceContext настроен для каждого вызова или сеанса.WCF действительно реализует механизм кэширования экземпляров, поэтому вы видите, что этот процесс ускоряется.

Если вы хотите истинную реализацию экземпляра синглтона, вам нужно установить InstanceContext в single (а ConcurrencyMode в многопоточность в зависимости от вашего вопроса).Информация).Другой способ получить одноэлементный экземпляр - написать код для использования этого конструктора из ServiceHost.

Я нахожусь в лагере, который препятствует использованию экземпляра одноэлементной службы WCF в производстве, потому чтоЯ доверяю платформе WCF гораздо лучше справляться с обработкой запросов посредством создания экземпляров для каждого вызова, чем я, выполняя свою собственную.YMMV:)

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