2012-08-22 25 views
7

Các triệu chứng được treo của ứng dụng (lưu trữ trong IIS 7) Khi gắn với debuging phát hiện ra rằng có ~ 100 chủ đề với ngăn xếp như thế này:NLog treo trong trace (? Đa luồng vấn đề)

NLog.dll!NLog.Targets.Target.WriteAsyncLogEvent(NLog.Common.AsyncLogEventInfo logEvent) + 0x54 bytes  
NLog.dll!NLog.LoggerImpl.WriteToTargetWithFilterChain(NLog.Internal.TargetWithFilterChain targetListHead, NLog.LogEventInfo logEvent, NLog.Common.AsyncContinuation onException) + 0x8b bytes  
NLog.dll!NLog.LoggerImpl.Write(System.Type loggerType, NLog.Internal.TargetWithFilterChain targets, NLog.LogEventInfo logEvent, NLog.LogFactory factory) + 0xee bytes  
NLog.dll!NLog.Logger.WriteToTargets(NLog.LogLevel level, string message, object[] args) + 0x14 bytes  
NLog.dll!NLog.Logger.Trace<System.__Canon,long>(string message, System.__Canon argument1, long argument2) + 0x90 bytes 
... <my app code> ... 

một với

mscorlib.dll!System.Collections.Generic.Dictionary<NLog.Layouts.Layout,string>.FindEntry(NLog.Layouts.Layout key) + 0xd0 bytes 
mscorlib.dll!System.Collections.Generic.Dictionary<System.__Canon,System.__Canon>.TryGetValue(System.__Canon key, out System.__Canon value) + 0x14 bytes  
NLog.dll!NLog.Layouts.SimpleLayout.GetFormattedMessage(NLog.LogEventInfo logEvent) + 0x81 bytes 
NLog.dll!NLog.Targets.FileTarget.GetBytesToWrite(NLog.LogEventInfo logEvent) + 0x1c bytes  
NLog.dll!NLog.Targets.FileTarget.Write(NLog.Common.AsyncLogEventInfo[] logEvents) + 0x308 bytes 
NLog.dll!NLog.Targets.Target.WriteAsyncLogEvents(NLog.Common.AsyncLogEventInfo[] logEvents) + 0x258 bytes  
NLog.dll!NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents(object state) + 0x1e6 bytes 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xdc bytes  
mscorlib.dll!System.Threading._TimerCallback.PerformTimerCallback(object state) + 0x97 bytes  
... <my app code> ... 

và một với

mscorlib.dll!System.Collections.Generic.Dictionary<NLog.Layouts.Layout,string>.Insert(NLog.Layouts.Layout key, string value, bool add) + 0x1e0 bytes  
NLog.dll!NLog.LogEventInfo.AddCachedLayoutValue(NLog.Layouts.Layout layout, string value) + 0x6c bytes 
NLog.dll!NLog.Layouts.Log4JXmlEventLayout.GetFormattedMessage(NLog.LogEventInfo logEvent) + 0xf5 bytes 
NLog.dll!NLog.Targets.Target.PrecalculateVolatileLayouts(NLog.LogEventInfo logEvent) + 0xb8 bytes  
NLog.dll!NLog.Targets.Wrappers.AsyncTargetWrapper.Write(NLog.Common.AsyncLogEventInfo logEvent) + 0x23 bytes  
NLog.dll!NLog.Targets.Target.WriteAsyncLogEvent(NLog.Common.AsyncLogEventInfo logEvent) + 0x151 bytes  
NLog.dll!NLog.LoggerImpl.WriteToTargetWithFilterChain(NLog.Internal.TargetWithFilterChain targetListHead, NLog.LogEventInfo logEvent, NLog.Common.AsyncContinuation onException) + 0x8b bytes  
NLog.dll!NLog.LoggerImpl.Write(System.Type loggerType, NLog.Internal.TargetWithFilterChain targets, NLog.LogEventInfo logEvent, NLog.LogFactory factory) + 0xee bytes  
NLog.dll!NLog.Logger.WriteToTargets(NLog.LogLevel level, string message, object[] args) + 0x14 bytes  
NLog.dll!NLog.Logger.Debug<Werp.Controller.Common.Interfaces.EntityEventAction,System.__Canon>(string message, Werp.Controller.Common.Interfaces.EntityEventAction argument1, System.__Canon argument2) + 0x8d bytes  
... <my app code> ... 

tình trạng này xảy ra một số lần, có thể là một lần một tuần, và tôi không có kịch bản exac để tái tạo nó.

Làm cách nào để khắc phục sự cố này? Có phải là lỗi trong NLog, hoặc có thể một số sự lạm dụng hoặc cấu hình sai của tôi?

Trả lời

1

Dictionary<T> không phải là thread an toàn, vì vậy việc tiếp cận nó trong nhiều chủ đề có thể dẫn đến các vấn đề như vậy,

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

http://blogs.msdn.com/b/asiatech/archive/2009/05/11/100-cpu-caused-by-system-collections-generic-dictionary.aspx

Thật khó biết được liệu bạn có thể cấu hình NLog làm việc trong multithreading . Bạn đã cố gắng sử dụng AsyncWrapper của nó?

http://nlog-project.org/wiki/AsyncWrapper_target

Theo NLog diễn đàn, sử dụng async cách nên giải quyết vấn đề,

http://nlog-forum.1685105.n2.nabble.com/Multi-Threading-in-NLog-td3728834.html

+0

Cảm ơn bạn đã tham gia, cấu hình của tôi đã chứa đó là phím tắt cho trình bao bọc không đồng bộ – pil0t

+0

Sau đó, nó gần như là lỗi mà nhà phát triển cần khắc phục. Bạn có truy cập http://nlog.codeplex.com/workitem/list/basic để báo cáo vấn đề này không? –

1

Gần đây tôi đã gặp phải cùng một vấn đề - rất nhiều chủ đề chặn trên WriteAsyncLogEvent. Tuy nhiên, tôi không có bất kỳ chủ đề Dictionary nào. Tôi đã có một sợi bị kẹt trong AsyncRequestQueue.Enqueue, mà bạn có thể đã bỏ sót trong danh sách chuỗi của mình.

Trong trường hợp của tôi, sự cố là overflowAction trên AsyncWrapper được đặt thành ... Block! Đặt nó thành Discard là cách khôn ngoan hơn nhiều để xử lý logger bị quá tải.

Đôi khi các thông điệp nhật ký tích lũy không do lỗi của chính NLog. Đôi khi quá trình này bị mắc kẹt vì các lý do khác (chặn đĩa, trao đổi nặng, chống vi-rút gây rối, đầy đủ GC). Danh sách chủ đề sau đó chứa rất nhiều luồng được gắn trên NLog đơn giản vì NLog xảy ra phụ thuộc vào cùng một tài nguyên quá tải.