2014-01-08 27 views
5

我們知道同步日誌記錄,將日誌消息寫入文件,然後繼續執行程序。異步記錄器隊列日誌消息並將它們寫入單獨的線程。我開始在我的項目中實現Log4CPlus,我想起了一些事情。異步記錄器是否真的有助於提高性能?

我無法初始化更多的LogObjects,因爲這會打開更多的文件句柄,我們不需要它。 (我知道我們應該使用基於特徵的日誌記錄對象,例如UploadLogObj,DownloadLogOb,WebReqLogObj,AuthLogObj等)。希望每個添加的日誌對象都可能會增加日誌記錄線程。

仍然是參數,如果我使用單個日誌對象並從多個線程推送日誌消息,我想必須有一些互斥鎖來防止寫入消息隊列。我的問題不會這個互斥鎖減慢進程,它不會造成性能問題..?

我只是想知道如何異步記錄器的工作,我可以看看代碼,這是一種方法。但希望這些答案對許多人都有啓發。

+0

你可以使用一個無鎖隊列,比如'boost :: lockfree :: queue'。 – Zeta

+1

異步記錄器在另一個線程中完成** IO任務**。 – Jarod42

回答

1

是的,互斥體會稍微減慢過程,但是如果您從多個線程記錄到相同的目標,則無論如何都需要某種形式的同步,因爲您不希望來自不同線程的線路混合向上。

到底它是決定其中同步,不如果的問題。使用異步日誌記錄時,會在將要記錄的對象推送到日誌記錄線程隊列時發生。在同步的情況下,可能在寫行的時候(儘管它取決於實現)。

在第一種情況下,在互斥體內花費的時間將更短且可預測,因爲在互斥體中不會發生磁盤刷新。這意味着您可能會在第二種情況下(加上您沒有花費時間編寫實際數據的時間,因爲其他線程正在處理它)而導致性能下降和更好的擴展。

如果你沒有太多的線程競爭互斥體,它不會有問題。我有機會在一段時間之前爲實時系統編寫和使用異步記錄器,並且在同步問題發生之前,我們就已經達到了磁盤帶寬相關的問題。

異步日誌記錄的一個缺點是內存相關性更高:因爲需要傳遞要記錄的數據,所以需要小心並避免不必要的分配/釋放。