log - 淺談日誌對性能影響的處理方案

日誌對服務性能有很大影響,由於要寫磁盤,且是寫同一份文件,因此會有臨界資源競爭,再高併發情況下,對性能影響十分明顯,但日誌又是必不可少的,在追求單機QPS的情況下,可以考慮以下兩種方案:

1.異步日誌

異步日誌可以最低程度減輕日誌對性能的影響,但也有一定風險,如果服務down掉了,錯誤棧還沒有來得及被寫入,那就尷尬了,另外還有幾個其他方面的問題:

一是異步日誌的情況下,有單次處理和批量處理兩種方案,如果採用批量處理,最好對單條日誌長度進行限制,適當丟棄過長的日誌,避免批量處理時佔滿內存;

此外,需要合理預估生產速度,以便佈置合適的消費者進行消費;

對於隊列的選擇也有一定要求,如果選擇阻塞隊列,仍然會影響性能,可以考慮使用無鎖隊列,log4j2中提供了無鎖的Disruptor Ring Buffer來優化緩衝隊列的性能方案,並且它解決了僞共享問題帶來的性能影響。

在生產者快於消費者,或消費者快於生產者,即填滿了Ring Buffer或Ring Buffer爲空時,需要進行等待,等待策略有以下幾種:

BlockWaiting:默認的策略,阻塞等待,但效率低下,佔用CPU最少。

SleepingWaiting:佔用CPU較多,適合異步寫日誌,處理延遲高,因爲要睡眠。

YieldingWaiting:佔用CPU較多,適合開啓了超線程模式,釋放CPU並服務其他線程。

BusySpinWaiting:輪詢,佔用CPU較多,適合未開啓超線程模式,獨佔CPU。

2.同步與異步相結合

雖然性能有所下降,但同步與異步相結合的方式可以有效避免異步得不到錯誤棧的問題,重要的ERROR日誌仍然採用同步方式,其他日誌可酌情使用異步。

幸運的是,Log4j2對異步已經有了較好的支持,在性能上也比log4j1x高很多,可以方便的在xml中配置同步與異步策略。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章