log4j2異步打印性能提升方式
log4j2異步打印性能提升
壓測結果發(fā)現(xiàn),log4j升級成log4j2之后對系統(tǒng)性能影響并不大,更改打印日志方式(同步修改成異步打?。?/p>
壓測結果發(fā)現(xiàn)TPS在開始階段提升較快,當壓力上來之后,TPS下降迅速,不如同步的數(shù)據(jù)(log4j2用的版本是2.3)
分析原因
獲取壓測是堆棧日志如下:
發(fā)現(xiàn)線程都在跑LockSupport.parkNanos也就是unsafe.park(false, 1);(private static final Unsafe unsafe = Unsafe.getUnsafe();)這行代碼。
具體功能是:調用 park后,線程將一直阻塞直到超時或者中斷等條件出現(xiàn)。unpark可以終止一個掛起的線程,使其恢復正常。
經(jīng)過分析壓測,發(fā)現(xiàn)當并發(fā)量打的時候該方法造成了大量的線程切換,也就是說明消費速度跟不上生產(chǎn)速度。線程被頻繁的休眠/喚醒導致 cpu使用率高,且性能較低。
解決方案
上邊原因分析到了,查詢下解決方案,發(fā)現(xiàn)了log4j的bug,已經(jīng)在2.7版本修復,所以替換log4j2的版本為2.7(JDK版本需要1.7以上,否則回報(unsupported major.minor version 51.0))
個人推薦JDK版本使用1.8。
具體代碼變動如下:
沒有了unsafe.park(false, 1); 被block的線程沒有一直被調度
log4j2性能提升點
1、log4j1寫日志多線程情況是阻塞的,log4j2不會阻塞,生產(chǎn)者只負責生產(chǎn),通過無鎖隊列ringbuffer的無阻塞內存隊列作為緩沖(即使用Disruptor),多生產(chǎn)者多線程的競爭是通過CAS實現(xiàn),性能較高,至于最后落地,雖然兩者都會調用synchronized方法寫入日志,log4j2的asynclogger支持多個消費者,每個消費者取一批待處理的日志,類似于分段,用于提高性能
2、Disruptor簡介
log4j2之所以能在異步寫日志時性能提高這么多,離不開優(yōu)秀的mq組件disruptor。
disruptor的主要設計思想是無鎖的高并發(fā),在設計上采用內存屏障的機制和CAS操作實現(xiàn)此思想。主流的并發(fā)程序
都離不開鎖對資源的管控,或者盡量避開鎖的使用。
理解為以下三點
1、有一個基于數(shù)組的循環(huán)數(shù)據(jù)結構(環(huán)裝緩沖區(qū))。這個循環(huán)數(shù)據(jù)結構,它是個擁有多個可用元素引用的數(shù)組。預先分配了對象內存空間。生產(chǎn)者與消費者通過這個循環(huán)數(shù)據(jù)結構進行讀寫操作,并不會有鎖或資源競爭。
2、在Disruptor中,采用消費者-生產(chǎn)者模型進行讀寫的分離,所有事件(events)以組播的方式被發(fā)布給所有消費者,以便下游隊列通過并行的方式進行消費。因為消費者的并行消費,需要協(xié)調消費者間的依賴關系。
3、生產(chǎn)者和消費者中有個序列計數(shù)器,指示緩沖區(qū)中當前正在被它所處理的元素。所有生產(chǎn)者或消費者都只可以修改它自己的序列計數(shù)器,但同時可以讀取其他的序列計數(shù)器,內存屏障加序列號的方式實現(xiàn)了無鎖的并發(fā)機制。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springboot?web項目中?Set-Cookie?失敗原因及解決辦法
這篇文章主要介紹了springboot?web項目中?Set-Cookie?失敗原因及解決辦法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-10-10java多線程返回值使用示例(callable與futuretask)
這篇文章主要介紹了多線程返回值使用示例(callable與futuretask),需要的朋友可以參考下2014-04-04Elasticsearch算分優(yōu)化方案之rescore_query示例詳解
這篇文章主要為大家介紹了Elasticsearch算分優(yōu)化方案之rescore_query示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08Java多線程通訊之wait,notify的區(qū)別詳解
這篇文章主要介紹了Java多線程通訊之wait,notify的區(qū)別詳解,非常不錯,具有一定的參考借鑒借鑒價值,需要的朋友可以參考下2018-07-07