Процесс был прерван из-за необработанного исключения - служба WCF - PullRequest
0 голосов
/ 17 мая 2018

Итак, у меня есть созданная мной служба WCF, которая получает сообщения от клиента и анализирует их на желаемый результат, а затем отправляет их другому клиенту через TCP / HTTP / FTP и т. Д. Эта служба Windows имеет длительные потоки для каждого клиента, созданные с использованием TPL.,

Поэтому для ведения журнала я использовал NLOG, ведение журнала в файл и просмотр событий с указанными ниже конфигурациями

<target xsi:type="File" name="flatfile" layout="${longdate} ${uppercase:${level}} ${message} ${exception:format=tostring,StackTrace}" 
              archiveAboveSize="2000000" archiveFileName="${basedir}/logs/archive/${shortdate}-{#####}.engine.log" archiveNumbering="Sequence" archiveEvery="None" 
              maxArchiveFiles="100" fileName="${basedir}/logs/engine.current.log" keepFileOpen="true" concurrentWrites="true" />

<target xsi:type="EventLog" name="eventlog" layout="${longdate} ${uppercase:${level}} ${message} ${exception:format=tostring} ${StackTrace}" log="Application" source="Nuance Interface Engine Service" eventId="${event-properties:EventID}" />

Даже когда я добавил concurrentWrites = "true", когда я запускаю службу WCF после 20+Прошло много часов. Я получил ошибку ниже в средстве просмотра событий

    Application: MyWcfService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.OutOfMemoryException
   at System.Text.StringBuilder..ctor(System.String, Int32, Int32, Int32)
   at NLog.Layouts.SimpleLayout.GetFormattedMessage(NLog.LogEventInfo)
   at NLog.Targets.FileTarget.GetFormattedMessage(NLog.LogEventInfo)
   at NLog.Targets.FileTarget.GetBytesToWrite(NLog.LogEventInfo)
   at NLog.Targets.FileTarget.Write(NLog.Common.AsyncLogEventInfo[])
   at NLog.Targets.Target.WriteAsyncLogEvents(NLog.Common.AsyncLogEventInfo[])
   at NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents(System.Object)
   at System.Threading.TimerQueueTimer.CallCallbackInContext(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.TimerQueueTimer.CallCallback()
   at System.Threading.TimerQueueTimer.Fire()
   at System.Threading.TimerQueue.FireQueuedTimerCompletion(System.Object)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

Не могли бы вы, пожалуйста, подсказать мне, где происходит эта проблема, я думал, что несколько потоков обращаются к этому файлу журнала, поэтому я добавил concurrentWrites = "true"приписать целевой файл nlog.

через 1 секунду после перехода к указанной выше ошибке я вижу еще одну ошибку в моем средстве просмотра событий.

Faulting application name: Hl7ic.Engine.View.exe, version: 18.0.1.160, time stamp: 0x5af5cd1f
Faulting module name: KERNELBASE.dll, version: 6.3.9600.18938, time stamp: 0x5a7dd8a7
Exception code: 0xe0434352
Fault offset: 0x00015ef8
Faulting process id: 0x1074
Faulting application start time: 0x01d3ea7338d9851c
Faulting application path: C:\Program Files (x86)\MyServices\MyWcfService.exe
Faulting module path: C:\windows\SYSTEM32\KERNELBASE.dll
Report Id: 59b36929-5688-11e8-80ca-005056a80aaa
Faulting package full name: 
Faulting package-relative application ID:

1 Ответ

0 голосов
/ 17 мая 2018

OutOfMemoryException означает, что на машине недостаточно памяти.Может быть, это было использовано другим приложением.Может быть, это было использовано вашим приложением.Возможно, ваше 32-разрядное приложение использовало адресное пространство в памяти в 2 гигабайта.

Чтобы диагностировать эту ошибку, затем используйте Process Explorer для захвата Fulldump приложения, которое использует слишком много памяти.Затем попробуйте использовать Visual Studio или WinDbg для исследования файла дампа памяти.

Чтобы удалить NLog из радара, вы можете выполнить обновление до NLog 4.4.6 (или новее).Это уменьшит выделения памяти с 70 pct.из более старых версий (при использовании FileTarget)

Если вы используете NLog 4.4.6 (или новее), вы можете еще больше оптимизировать NLog, не используя <targets async="true">, а вместо этого используйте default-wrapper:

<targets>
   <default-wrapper xsi:type="AsyncWrapper" timeToSleepBetweenBatches="0" />

   <target .... />

   <target .... />

</targets>

См. Также https://github.com/NLog/NLog/wiki/Performance

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