欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

log4j2異步打印性能提升方式

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

log4j2異步打印性能提升

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

這里寫圖片描述

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

分析原因

獲取壓測(cè)是堆棧日志如下:

這里寫圖片描述

這里寫圖片描述

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

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

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

解決方案

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

個(gè)人推薦JDK版本使用1.8。

具體代碼變動(dòng)如下:

這里寫圖片描述

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

log4j2性能提升點(diǎn)

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

2、Disruptor簡(jiǎn)介

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

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

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

理解為以下三點(diǎn)

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

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

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

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

相關(guān)文章

  • java基礎(chǔ)理論Stream的Filter與謂詞邏輯

    java基礎(chǔ)理論Stream的Filter與謂詞邏輯

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

    springboot?web項(xiàng)目中?Set-Cookie?失敗原因及解決辦法

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

    RocketMQ?源碼分析Broker消息刷盤服務(wù)

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

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

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

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

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

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

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

    Java中常見的XML解析方法與應(yīng)用詳解

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

    Java基礎(chǔ)之序列化與反序列化詳解

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

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

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

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

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

最新評(píng)論