异步记录器真的有助于提高性能吗

Do Asynchronous Loggers really help in performance?

本文关键字:高性能 有助于 记录器 真的 异步      更新时间:2023-10-16

我们知道同步日志记录,将日志消息写入文件,然后继续执行程序。异步记录器将日志消息排队,并将它们写入一个单独的线程中。我开始在我的项目中实现Log4CPlus,我想到了几件事。

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

还是为了论证起见,如果我使用单个日志对象并从多个线程推送日志消息,我认为必须有一些互斥锁来防止写入消息队列。我的问题是,这个互斥锁不会减慢进程,不会造成性能问题吗。。?

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

是的,互斥会稍微减慢进程,但如果您从多个线程记录到同一个目标,您无论如何都需要某种形式的同步,因为您不希望来自不同线程的行混合在一起。

最后,这是一个决定在哪里同步的问题,而不是如果。对于异步日志记录,当要记录的对象被推送到日志记录线程的队列时,就会发生这种情况。在同步的情况下,可能是在写行的时候(尽管这取决于实现)。

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

如果你没有很多线程在争夺互斥,那也没什么问题。不久前,我有机会为实时系统编写并使用异步记录器,早在同步问题出现之前,我们就遇到了与磁盘带宽相关的问题。

异步日志记录的一个缺点是与内存有关:由于需要传递要记录的数据,因此需要小心,避免不必要的分配/释放。

在现代硬件上,互斥锁大约需要40-60纳秒(如果互斥没有被另一个线程锁定)。与IO操作相比,这算不了什么,IO操作理论上可以将文件写入速度较慢的HDD或网络驱动器几秒钟。

无锁是另一回事——在这种情况下,您甚至没有互斥对象。然而,这是有代价的——你必须编写一个更复杂的代码。