亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

log4j2異步打印性能提升方式

 更新時間:2021年12月22日 15:01:30   作者:唐震宇  
這篇文章主要介紹了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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java基礎理論Stream的Filter與謂詞邏輯

    java基礎理論Stream的Filter與謂詞邏輯

    這篇文章主要為大家介紹了java基礎理論Stream的Filter與謂詞邏輯,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • springboot?web項目中?Set-Cookie?失敗原因及解決辦法

    springboot?web項目中?Set-Cookie?失敗原因及解決辦法

    這篇文章主要介紹了springboot?web項目中?Set-Cookie?失敗原因及解決辦法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • RocketMQ?源碼分析Broker消息刷盤服務

    RocketMQ?源碼分析Broker消息刷盤服務

    這篇文章主要為大家介紹了RocketMQ?源碼分析Broker消息刷盤服務示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • java多線程返回值使用示例(callable與futuretask)

    java多線程返回值使用示例(callable與futuretask)

    這篇文章主要介紹了多線程返回值使用示例(callable與futuretask),需要的朋友可以參考下
    2014-04-04
  • 單機redis分布式鎖實現(xiàn)原理解析

    單機redis分布式鎖實現(xiàn)原理解析

    這篇文章主要介紹了單機redis分布式鎖實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java 截取視頻資料中的某一幀作為縮略圖

    Java 截取視頻資料中的某一幀作為縮略圖

    最近項目中有一個需求,就是Java 截取視頻資料中的某一幀作為縮略圖,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java中常見的XML解析方法與應用詳解

    Java中常見的XML解析方法與應用詳解

    XML(eXtensible Markup Language)是一種用于存儲和傳輸數(shù)據(jù)的標記語言,被廣泛應用于表示和交換獨立于應用程序和硬件平臺的結構化信息,下面我們就來看看它的常見解析方法有哪些吧
    2024-01-01
  • Java基礎之序列化與反序列化詳解

    Java基礎之序列化與反序列化詳解

    這篇文章主要介紹了Java基礎之序列化與反序列化詳解,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • Elasticsearch算分優(yōu)化方案之rescore_query示例詳解

    Elasticsearch算分優(yōu)化方案之rescore_query示例詳解

    這篇文章主要為大家介紹了Elasticsearch算分優(yōu)化方案之rescore_query示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java多線程通訊之wait,notify的區(qū)別詳解

    Java多線程通訊之wait,notify的區(qū)別詳解

    這篇文章主要介紹了Java多線程通訊之wait,notify的區(qū)別詳解,非常不錯,具有一定的參考借鑒借鑒價值,需要的朋友可以參考下
    2018-07-07

最新評論