最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

log4j2異步打印性能提升方式

 更新時間:2021年12月22日 15:01:30   作者:唐震宇  
這篇文章主要介紹了log4j2異步打印性能提升方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

log4j2異步打印性能提升

壓測結(jié)果發(fā)現(xiàn),log4j升級成log4j2之后對系統(tǒng)性能影響并不大,更改打印日志方式(同步修改成異步打?。?/p>

這里寫圖片描述

壓測結(jié)果發(fā)現(xiàn)TPS在開始階段提升較快,當(dāng)壓力上來之后,TPS下降迅速,不如同步的數(shù)據(jù)(log4j2用的版本是2.3)

分析原因

獲取壓測是堆棧日志如下:

這里寫圖片描述

這里寫圖片描述

發(fā)現(xiàn)線程都在跑LockSupport.parkNanos也就是unsafe.park(false, 1);(private static final Unsafe unsafe = Unsafe.getUnsafe();)這行代碼。

具體功能是:調(diào)用 park后,線程將一直阻塞直到超時或者中斷等條件出現(xiàn)。unpark可以終止一個掛起的線程,使其恢復(fù)正常。

經(jīng)過分析壓測,發(fā)現(xiàn)當(dāng)并發(fā)量打的時候該方法造成了大量的線程切換,也就是說明消費速度跟不上生產(chǎn)速度。線程被頻繁的休眠/喚醒導(dǎo)致 cpu使用率高,且性能較低。

解決方案

上邊原因分析到了,查詢下解決方案,發(fā)現(xiàn)了log4j的bug,已經(jīng)在2.7版本修復(fù),所以替換log4j2的版本為2.7(JDK版本需要1.7以上,否則回報(unsupported major.minor version 51.0))

個人推薦JDK版本使用1.8。

具體代碼變動如下:

這里寫圖片描述

沒有了unsafe.park(false, 1); 被block的線程沒有一直被調(diào)度

log4j2性能提升點

1、log4j1寫日志多線程情況是阻塞的,log4j2不會阻塞,生產(chǎn)者只負(fù)責(zé)生產(chǎn),通過無鎖隊列ringbuffer的無阻塞內(nèi)存隊列作為緩沖(即使用Disruptor),多生產(chǎn)者多線程的競爭是通過CAS實現(xiàn),性能較高,至于最后落地,雖然兩者都會調(diào)用synchronized方法寫入日志,log4j2的asynclogger支持多個消費者,每個消費者取一批待處理的日志,類似于分段,用于提高性能

2、Disruptor簡介

log4j2之所以能在異步寫日志時性能提高這么多,離不開優(yōu)秀的mq組件disruptor。

disruptor的主要設(shè)計思想是無鎖的高并發(fā),在設(shè)計上采用內(nèi)存屏障的機制和CAS操作實現(xiàn)此思想。主流的并發(fā)程序

都離不開鎖對資源的管控,或者盡量避開鎖的使用。

理解為以下三點

1、有一個基于數(shù)組的循環(huán)數(shù)據(jù)結(jié)構(gòu)(環(huán)裝緩沖區(qū))。這個循環(huán)數(shù)據(jù)結(jié)構(gòu),它是個擁有多個可用元素引用的數(shù)組。預(yù)先分配了對象內(nèi)存空間。生產(chǎn)者與消費者通過這個循環(huán)數(shù)據(jù)結(jié)構(gòu)進行讀寫操作,并不會有鎖或資源競爭。

2、在Disruptor中,采用消費者-生產(chǎn)者模型進行讀寫的分離,所有事件(events)以組播的方式被發(fā)布給所有消費者,以便下游隊列通過并行的方式進行消費。因為消費者的并行消費,需要協(xié)調(diào)消費者間的依賴關(guān)系。

3、生產(chǎn)者和消費者中有個序列計數(shù)器,指示緩沖區(qū)中當(dāng)前正在被它所處理的元素。所有生產(chǎn)者或消費者都只可以修改它自己的序列計數(shù)器,但同時可以讀取其他的序列計數(shù)器,內(nèi)存屏障加序列號的方式實現(xiàn)了無鎖的并發(fā)機制。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 兩種延時thread和timer詳解及實例代碼

    Java 兩種延時thread和timer詳解及實例代碼

    這篇文章主要介紹了Java 兩種延時thread和timer詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • springboot的logback配置源碼解讀

    springboot的logback配置源碼解讀

    這篇文章主要為大家介紹了springboot的logback配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Spring如何更簡單的讀取和存儲對象

    Spring如何更簡單的讀取和存儲對象

    這篇文章主要給大家介紹了關(guān)于Spring如何更簡單的讀取和存儲對象的相關(guān)資料,在Spring 中想要更簡單的存儲和讀取對象的核?是使?注解,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Elasticsearch學(xué)習(xí)之Terms?set?查詢

    Elasticsearch學(xué)習(xí)之Terms?set?查詢

    這篇文章主要為大家介紹了Elasticsearch學(xué)習(xí)Terms?set?查詢示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java多態(tài)性定義與用法實例詳解

    Java多態(tài)性定義與用法實例詳解

    這篇文章主要介紹了Java多態(tài)性定義與用法,較為詳細(xì)的分析了多態(tài)的概念、功能以及java定義與實現(xiàn)面向?qū)ο蠖鄳B(tài)性的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Java網(wǎng)絡(luò)通信基礎(chǔ)編程(必看篇)

    Java網(wǎng)絡(luò)通信基礎(chǔ)編程(必看篇)

    下面小編就為大家?guī)硪黄狫ava網(wǎng)絡(luò)通信基礎(chǔ)編程(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 基于FLink實現(xiàn)實時安全檢測的示例代碼

    基于FLink實現(xiàn)實時安全檢測的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于FLink實現(xiàn)實時安全檢測的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下
    2023-02-02
  • Java中方法的重載與重寫舉例比較

    Java中方法的重載與重寫舉例比較

    這篇文章主要給大家介紹了關(guān)于Java中方法的重載與重寫的相關(guān)資料,Java中的方法重載和重寫是面向?qū)ο缶幊讨械膬蓚€重要概念,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Spring Boot集成MyBatis-Plus 自定義攔截器實現(xiàn)動態(tài)表名切換功能

    Spring Boot集成MyBatis-Plus 自定義攔截器實現(xiàn)動態(tài)表名切換功能

    本文介紹了如何在SpringBoot項目中集成MyBatis-Plus,并通過自定義攔截器實現(xiàn)動態(tài)表名切換,此外,還探討了MyBatis攔截器在其他場景中的應(yīng)用,如SQL日志記錄、多租戶數(shù)據(jù)隔離、數(shù)據(jù)權(quán)限控制等,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • java高效實現(xiàn)大文件拷貝功能

    java高效實現(xiàn)大文件拷貝功能

    這篇文章主要為大家詳細(xì)介紹了java高效實現(xiàn)大文件拷貝功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評論

辰溪县| 河南省| 高淳县| 建始县| 南溪县| 天津市| 昆山市| 靖西县| 平利县| 定陶县| 和林格尔县| 那坡县| 潜山县| 集贤县| 宜阳县| 松江区| 抚顺市| 越西县| 江安县| 大洼县| 罗山县| 永春县| 略阳县| 南阳市| 阿荣旗| 达州市| 大名县| 汉阴县| 西乌珠穆沁旗| 岳池县| 乐东| 邵阳县| 乌审旗| 冷水江市| 隆安县| 太仆寺旗| 凌海市| 项城市| 新龙县| 集安市| 上高县|