2014-01-08 26 views
5

我们知道同步日志记录,将日志消息写入文件,然后继续执行程序。异步记录器队列日志消息并将它们写入单独的线程。我开始在我的项目中实现Log4CPlus,我想起了一些事情。异步记录器是否真的有助于提高性能?

我无法初始化更多的LogObjects,因为这会打开更多的文件句柄,我们不需要它。 (我知道我们应该使用基于特征的日志记录对象,例如UploadLogObj,DownloadLogOb,WebReqLogObj,AuthLogObj等)。希望每个添加的日志对象都可能会增加日志记录线程。

仍然是参数,如果我使用单个日志对象并从多个线程推送日志消息,我想必须有一些互斥锁来防止写入消息队列。我的问题不会这个互斥锁减慢进程,它不会造成性能问题..?

我只是想知道如何异步记录器的工作,我可以看看代码,这是一种方法。但希望这些答案对许多人都有启发。

+0

你可以使用一个无锁队列,比如'boost :: lockfree :: queue'。 – Zeta

+1

异步记录器在另一个线程中完成** IO任务**。 – Jarod42

回答

1

是的,互斥体会稍微减慢过程,但是如果您从多个线程记录到相同的目标,则无论如何都需要某种形式的同步,因为您不希望来自不同线程的线路混合向上。

到底它是决定其中同步,不如果的问题。使用异步日志记录时,会在将要记录的对象推送到日志记录线程队列时发生。在同步的情况下,可能在写行的时候(尽管它取决于实现)。

在第一种情况下,在互斥体内花费的时间将更短且可预测,因为在互斥体中不会发生磁盘刷新。这意味着您可能会在第二种情况下(加上您没有花费时间编写实际数据的时间,因为其他线程正在处理它)而导致性能下降和更好的扩展。

如果你没有太多的线程竞争互斥体,它不会有问题。我有机会在一段时间之前为实时系统编写和使用异步记录器,并且在同步问题发生之前,我们就已经达到了磁盘带宽相关的问题。

异步日志记录的一个缺点是内存相关性更高:因为需要传递要记录的数据,所以需要小心并避免不必要的分配/释放。