【问题标题】:Writing to a log4net FileAppender with multiple threads performance problems写入具有多线程性能问题的 log4net FileAppender
【发布时间】:2011-02-16 13:58:20
【问题描述】:

TickZoom 是一个非常高性能的应用程序,它使用自己的并行化库和多个 O/S 线程来顺利利用多核计算机。

应用遇到瓶颈,用户需要从单独的 O/S 线程将信息写入 LogAppender。

FileAppender 使用 MinimalLock 特性,这样每个线程都可以锁定并写入文件,然后释放它以供下一个线程写入。

如果 MinimalLock 被禁用,log4net 会报告有关文件已被另一个进程(线程)锁定的错误。

对 log4net 来说,一个更好的方法是让一个线程负责写入 FileAppender,而任何其他线程只需将它们的消息添加到队列中。

这样,可以禁用 MinimalLock 以大大提高日志记录的性能。

此外,应用程序会执行大量 CPU 密集型工作,因此使用单独的线程写入文件也会提高性能,因此 CPU 不会等待 I/O 完成。

所以问题是,log4net 是否已经提供了这个功能?如果是这样,您如何启用对文件的线程写入?也许还有另一个更高级的附加程序?

如果没有,那么由于 log4net 已经封装在平台中,因此可以在 TickZoom 代码中为此目的实现单独的线程和队列。

真诚地, 韦恩

编辑:

谢谢,答案似乎指向开发我们自己的解决方案,以某种方式作为 log4net 的扩展。他们清楚地表明 log4net 不会做这种事情。

此外,我们刚刚意识到我们可能正在“滥用”日志系统,该系统主要用于人类可读的消息,用于通知重要事件或调试信息。软件输出的这一特定部分仅真正用于验证系统准确性的自动化工具。

当然,我们也以“正常”的方式使用 log4net 进行调试、警告等。

但这些更像是“事务日志”,而不是调试或用户通知日志。更具体地说,这些日志没有必要直接供人类阅读。如有必要,某种“查看器”可以以 ASCII 格式显示内容。

因此,我们将计划将这些事务类型的日志写入高速二进制存储。

谢谢,下面的两个答案似乎都对开发我们自己的解决方案很有帮助。

【问题讨论】:

    标签: c# multithreading log4net fileappender


    【解决方案1】:

    查看 The Object Guy 的记录器,了解高性能、多线程安全记录器,该记录器具有异步记录功能以及许多其他功能 - 我认为非常好 - http://www.theobjectguy.com/DotNetLog/。请参阅此页面上的多线程视频。

    【讨论】:

      【解决方案2】:

      避免向目标线程添加任何 I/O 是非常可取的,因此向日志收集器线程发送消息是个好主意。我有时也会使用目标线程中的 System::Diagnostics::Debug::WriteLine 来转储它的输出,但无论如何里面肯定会有一点锁定。

      当然,添加任何额外的日志记录会导致“海森堡”效应,因此您必须以某种方式知道这些效应何时可以忽略不计,以便对高性能线程进行有用的日志记录。

      如果您想变得更高级一点,可以让每个线程保存自己的消息列表,然后在经过多次迭代后将其转储到某个地方。因此,数据仅在任何线程执行其记录 I/O 之前的一段时间内有用,但也许您可以捕获足够的信息用于调试。此外,您还可以完成将各个线程日志整理到单个日志中进行分析的有趣任务。

      【讨论】:

        【解决方案3】:

        Log4net 不支持您描述的确切场景。但是,它确实提供了其他不锁定的附加程序,例如数据库附加程序或 UDP 附加程序。这里有几个想法:

        1. 将您的消息记录到消息中 排队,然后有一个阅读器(或 几个读者)阅读消息 队列并将它们写入日志。 这提供了一个可靠的机制 发送/写消息。老实说 不知道现在有没有 MSMQ 附加程序,但正在编写它 自己不会太难。

        2. 使用 UDP appender 发送 消息然后写你自己的 监听这些的服务 消息并将它们写入文件。

        我认为您可以在这里检测到主题...基本上使用非阻塞附加程序之一(或编写您自己的)并实现您自己的服务,该服务接收来自附加程序的消息并将它们写入文件。

        【讨论】:

        • 感谢您澄清它在 log4net 中是不可能的,并推动了内部解决方案的发展。
        猜你喜欢
        • 2010-11-20
        • 2015-11-11
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        相关资源
        最近更新 更多