У нас есть консольное приложение C# (.Net 4.0), которое «самостоятельно» использует две службы WCF: один использует WSHttpBinding
, а другой использует BasicHttpBinding
.Приложение WCF «Self-Hosted» перестает отвечать на запросы
Подключение к этим услугам у нас есть два отдельных клиентских приложения: служба на основе Silverlight, которая использует BasicHttpBinding
и другое консольное приложение, которое использует WSHttpBinding
.
Приложение службы WCF обычно имеет около 30 пользователей, подключенных через клиент Silverlight, и еще пару подключений от клиента консольного приложения. Он не «выровнен» любыми способами; каждый клиент запрашивает службу WCF, возможно, раз в 5 секунд.
Проблема заключается в том, что с перерывами приложение обслуживания перестает отвечать на запросы. Хотя сам сервер продолжает работать (он продолжает записывать в файл журнала), все действия WCF (на обоих ServiceHost
с), похоже, «захватывают». Новые запросы не обрабатываются (хотя TCP-соединения принимаются). Кроме того, количество потоков, потребляемых приложением, начинает резко увеличиваться со скоростью около одного нового потока в секунду. Сам код ничего не делает с Thread
s или ThreadPool
s, хотя он иногда выдает Thread.Sleep
на несколько сотен миллисекунд.
Неудобная вещь - проблема прерывистой проблемы: код регулярно работает в течение нескольких часов, даже дней без каких-либо проблем. Затем, без видимой причины, он внезапно перестает реагировать, и количество потоков начинает тикать.
Я пробовал имитировать активность пользователя - подключение и отключение клиентов, «обманывание» службы запросами - но я ничего не могу сделать, чтобы воспроизвести ошибку.
Только в случае, если вопрос был WCF Throttling, я добавил этот код:
ServiceThrottlingBehavior throttlingBehavior = new System.ServiceModel.Description.ServiceThrottlingBehavior
{
MaxConcurrentCalls = 512,
MaxConcurrentInstances = 8192,
MaxConcurrentSessions = 8192
};
host.Description.Behaviors.Add(throttlingBehavior);
host2.Description.Behaviors.Add(throttlingBehavior);
.. без видимого эффекта.
Я поместил обширный журнал в код, чтобы попытаться определить, что это такое, что вызывает это поведение - протоколирование каждого вызова для каждого метода, но в результате ничего не появилось. Я завернул все в try
... catch
блокирует и выплескивает любые исключения из файла журнала, чтобы увидеть, что-то падает где-то, а также поймал в ловушку UnhandledException
с таким же образом ... но опять же ничего не происходит неправильно.
Вызывает ли вышеуказанное поведение знакомое кому-либо, или может ли кто-нибудь предложить наилучший путь для устранения этой проблемы?
EDIT: Следующий совет Wal в ниже, я захватил .DMP приложения, когда он начинает плохо себя, и, глядя на параллельных стеков просмотра в VS2012, я вижу:
... и другие очень похожи, но с различным количеством потоков. Я недостаточно умен, чтобы декодировать именно то, что это значит. Может ли кто-нибудь предложить, с чего начать смотреть дальше?
Как вы в .net4, вы можете взять дамп своего процесса с помощью задачи mgr и перетащить этот файл дампа обратно в VS и посмотреть на параллельные стеки, чтобы увидеть, что происходит. * hopefully * его очевидно, иначе вам, возможно, придется идти по маршруту windbg. (используя тот же файл дампа). Надеюсь, проблема раскрывается как нечто простое, как что-то неподобающее, которое посылают ваши клиенты, которые непреднамеренно поддерживают вашу очередь обработки. – wal
Закрываете ли вы своих клиентов после вызова метода? Может быть связано http://johan.driessen.se/posts/do-not-forget-to-close-your-wcf-serviceclients – keyboardP
Я полагаю, вы пробовали, но ... вы включили сбор (почти) ВСЕ ** счетчики производительности **, связанные с вашим процессом? Когда это произойдет, вы можете сравнить собранные данные (_contention_ растет вместе с потоками? Использование памяти растет быстрее, чем потоки?) И так далее ...) –