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

Logback與Log4j2日志框架性能對(duì)比與調(diào)優(yōu)方式

 更新時(shí)間:2021年12月22日 14:26:12   作者:小老板v  
這篇文章主要介紹了Logback與Log4j2日志框架性能對(duì)比與調(diào)優(yōu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

看到目前線(xiàn)上大多日志框架測(cè)評(píng)大多從宏觀(guān)角度,直接對(duì)比異步同步的吞吐量,但是沒(méi)有考量到更深層的淘汰機(jī)制、等待策略、隊(duì)列長(zhǎng)度等對(duì)性能表現(xiàn)的影響,因此本文將從更多的角度對(duì)比及分析兩款日志框架的性能表現(xiàn),通過(guò)JProfiler+Jmeter壓測(cè)及數(shù)據(jù)采集,從線(xiàn)程占用、鎖占用、宏觀(guān)耗時(shí)等多維度可視化數(shù)據(jù)。

性能測(cè)試

logback

同步日志

耗時(shí)

在這里插入圖片描述

在這里插入圖片描述

未經(jīng)過(guò)任何調(diào)優(yōu),采用Logback默認(rèn)配置得出上圖,一百萬(wàn)條日志打印耗時(shí)(ms),如圖:?jiǎn)尉€(xiàn)程下性能最佳,耗時(shí)隨線(xiàn)程數(shù)增加而下降。

線(xiàn)程占用

單線(xiàn)程

在這里插入圖片描述

無(wú)阻塞狀態(tài)

多線(xiàn)程

多線(xiàn)程打印日志時(shí),會(huì)產(chǎn)生大量線(xiàn)程阻塞,線(xiàn)程越多阻塞狀態(tài)越多

四線(xiàn)程

在這里插入圖片描述

八線(xiàn)程

在這里插入圖片描述

十六線(xiàn)程

在這里插入圖片描述

鎖占用

在這里插入圖片描述

線(xiàn)程發(fā)生多次占用鎖的情況。查看Logback源碼可得知,檢查容量、放入隊(duì)列、取出隊(duì)列都需要在取得鎖后進(jìn)行

異步日志(隊(duì)列擴(kuò)容)

樣本數(shù)100萬(wàn),隊(duì)列長(zhǎng)度110萬(wàn)

耗時(shí)

在這里插入圖片描述

在這里插入圖片描述

線(xiàn)程占用

單線(xiàn)程

在這里插入圖片描述

多線(xiàn)程

四線(xiàn)程

在這里插入圖片描述

八線(xiàn)程

在這里插入圖片描述

十六線(xiàn)程

在這里插入圖片描述

鎖占用

在這里插入圖片描述

每次寫(xiě)入隊(duì)列都需要占用鎖,同時(shí)Appender從隊(duì)列取出也需要占用鎖

異步日志(半隊(duì)列擴(kuò)容)

樣本數(shù)100萬(wàn),隊(duì)列長(zhǎng)度50萬(wàn),不啟用拋棄策略

耗時(shí)

在這里插入圖片描述

在這里插入圖片描述

線(xiàn)程占用

單線(xiàn)程

在這里插入圖片描述

多線(xiàn)程

寫(xiě)入耗時(shí)明顯增長(zhǎng),寫(xiě)入過(guò)程仍然發(fā)生阻塞狀態(tài)

四線(xiàn)程

在這里插入圖片描述

八線(xiàn)程

在這里插入圖片描述

十六線(xiàn)程

在這里插入圖片描述

鎖占用

在這里插入圖片描述

log4j2

同步日志

樣本數(shù)100萬(wàn),Logger到Appender串行執(zhí)行,輸出到文件

耗時(shí)

在這里插入圖片描述

在這里插入圖片描述

線(xiàn)程占用

線(xiàn)程產(chǎn)生長(zhǎng)時(shí)間的等待,主要是緩沖環(huán)溢出后無(wú)法寫(xiě)入,生產(chǎn)者根據(jù)等待策略進(jìn)入等待狀態(tài)

單線(xiàn)程

在這里插入圖片描述

單線(xiàn)程生產(chǎn)不需要爭(zhēng)搶鎖,因此全程無(wú)阻塞

多線(xiàn)程

整體來(lái)看,阻塞的時(shí)間隨著線(xiàn)程增多而增多,因此多線(xiàn)程對(duì)同步日志影響極大,性能損失嚴(yán)重

四線(xiàn)程

在這里插入圖片描述

八線(xiàn)程

在這里插入圖片描述

十六線(xiàn)程

在這里插入圖片描述

后續(xù)監(jiān)控因阻塞時(shí)間太長(zhǎng)跳過(guò)

鎖占用

在這里插入圖片描述

阻塞在A(yíng)ppender上的輸出流上,輸出流是在單線(xiàn)程中執(zhí)行的

異步日志(隊(duì)列擴(kuò)容)

樣本數(shù)100萬(wàn),隊(duì)列長(zhǎng)度110萬(wàn),使用Yield等待策略

耗時(shí)

在這里插入圖片描述

在這里插入圖片描述

單線(xiàn)程占用最高,耗時(shí)隨線(xiàn)程數(shù)增加而縮短,直到線(xiàn)程數(shù)超過(guò)CPU核數(shù)。單線(xiàn)程耗時(shí)與logback相當(dāng),多線(xiàn)程耗時(shí)比logback縮短了2倍

線(xiàn)程占用

單線(xiàn)程與多線(xiàn)程使用都無(wú)阻塞狀態(tài),保證足夠的隊(duì)列容量,能使日志操作保持高吞吐和低延遲,避免阻塞等待

單線(xiàn)程

在這里插入圖片描述

多線(xiàn)程

四線(xiàn)程

在這里插入圖片描述

八線(xiàn)程

在這里插入圖片描述

使用與宿主機(jī)CPU核數(shù)相等的線(xiàn)程數(shù),日志寫(xiě)入過(guò)程無(wú)阻塞、無(wú)線(xiàn)程切換

十六線(xiàn)程

在這里插入圖片描述

異步日志(日志淘汰策略)

樣本數(shù)100萬(wàn),隊(duì)列長(zhǎng)度50萬(wàn),啟用拋棄策略

耗時(shí)

在這里插入圖片描述

在這里插入圖片描述

線(xiàn)程占用

隊(duì)列長(zhǎng)度50萬(wàn),正常來(lái)說(shuō)應(yīng)與半隊(duì)列擴(kuò)容一樣,產(chǎn)生阻塞現(xiàn)象,但啟用了日志淘汰策略,無(wú)法寫(xiě)入隊(duì)列的將直接拋棄不阻塞等待

單線(xiàn)程

在這里插入圖片描述

多線(xiàn)程

四線(xiàn)程

在這里插入圖片描述

八線(xiàn)程

在這里插入圖片描述

十六線(xiàn)程

在這里插入圖片描述

異步日志(半隊(duì)列擴(kuò)容)

樣本數(shù)100萬(wàn),隊(duì)列長(zhǎng)度50萬(wàn),使用Yield等待策略

耗時(shí)

在這里插入圖片描述

在這里插入圖片描述

當(dāng)隊(duì)列滿(mǎn)后,大幅影響了響應(yīng)時(shí)間,吞吐量依賴(lài)Appender的消費(fèi)性能

線(xiàn)程占用

單線(xiàn)程記錄日志時(shí),前半段隊(duì)列未滿(mǎn)時(shí)生產(chǎn)線(xiàn)程一直處于工作狀態(tài),后半段因消費(fèi)能力跟不上生產(chǎn)能力,導(dǎo)致隊(duì)列滿(mǎn)載,生產(chǎn)線(xiàn)程開(kāi)始出現(xiàn)等待狀態(tài)

單線(xiàn)程

在這里插入圖片描述

等待的時(shí)間比多線(xiàn)程少,是因?yàn)閱尉€(xiàn)程下日志生產(chǎn)速度慢,同時(shí)日志也在倍消費(fèi)

多線(xiàn)程

前一段時(shí)間可以維持高性能工作,但后面隊(duì)列滿(mǎn)后開(kāi)始發(fā)送等待,導(dǎo)致耗時(shí)延長(zhǎng)

四線(xiàn)程

在這里插入圖片描述

八線(xiàn)程

在這里插入圖片描述

十六線(xiàn)程

在這里插入圖片描述

鎖占用

在這里插入圖片描述

并未發(fā)現(xiàn)日志記錄過(guò)程中發(fā)生鎖占用

異步日志(等待策略)

樣本數(shù)100萬(wàn),隊(duì)列長(zhǎng)度50萬(wàn),使用Timeout等待策略

耗時(shí)

在這里插入圖片描述

在這里插入圖片描述

線(xiàn)程占用

在這里插入圖片描述

未產(chǎn)生阻塞狀態(tài)

單線(xiàn)程

多線(xiàn)程

因Timeout等待策略使用了鎖,因此產(chǎn)生一定的阻塞

四線(xiàn)程

在這里插入圖片描述

八線(xiàn)程

在這里插入圖片描述

十六線(xiàn)程

在這里插入圖片描述

鎖占用

在這里插入圖片描述

使用Timeout等待策略時(shí),放入隊(duì)列前會(huì)取鎖,進(jìn)行消費(fèi)者線(xiàn)程喚醒動(dòng)作

性能調(diào)優(yōu)

異步日志

無(wú)論是logback還是log4j2,使用異步日志可以大幅提高日志操作耗時(shí),間接提高業(yè)務(wù)方整體耗時(shí)

日志可靠性

異步日志無(wú)法保證日志可靠性,系統(tǒng)意外關(guān)閉會(huì)丟失隊(duì)列中的日志,因此要求高可靠的日志,應(yīng)該選擇數(shù)據(jù)庫(kù)或者M(jìn)Q來(lái)保證

Logback

通過(guò)

<appender name="async-log-all" class="ch.qos.logback.classic.AsyncAppender">

設(shè)置

Log4j2

通過(guò)

System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector")

設(shè)置

日志拋棄策略

將溢出隊(duì)列的日志拋棄,保持穩(wěn)定的響應(yīng)速度。對(duì)業(yè)務(wù)方來(lái)說(shuō)能保持良好、穩(wěn)定的日志服務(wù),但需要容忍一定的日志丟

Log4j2

通過(guò)

System.setProperty("log4j2.AsyncQueueFullPolicy","Discard")

設(shè)置

Logback

通過(guò)&lt;discardingThreshold&gt;指定拋棄日志的閾值

拋棄邊界

當(dāng)隊(duì)列剩余容量小于閾值后,將拋棄ERROR以下的日志

禁用拋棄策略

設(shè)置為0則表示不拋棄,業(yè)務(wù)線(xiàn)程等待隊(duì)列空間可用后寫(xiě)入

默認(rèn)閾值

默認(rèn)閾值為隊(duì)列長(zhǎng)度的20%,隊(duì)列長(zhǎng)度100閾值為20

日志等待策略

Log4j2獨(dú)有的特性,指定隊(duì)列滿(mǎn)時(shí),生產(chǎn)者進(jìn)行等待的行為,需要在不開(kāi)啟拋棄策略下進(jìn)行

TimeoutWaitStrategy

Log4j2默認(rèn)的等待策略,通過(guò)Object.wait等待隊(duì)列騰空。在放入隊(duì)列時(shí)會(huì)加鎖,不推薦使用。

YieldWaitStrategy

通過(guò)

System.setProperty("log4j2.asyncLoggerWaitStrategy","Yield")

設(shè)置。通過(guò)System.yield()等待隊(duì)列騰空,比Timeout等待策略更高效,比Busy等待策略更節(jié)能

隊(duì)列容量

由性能測(cè)試可知,不適用日志拋棄策略下,隊(duì)列滿(mǎn)載后生產(chǎn)線(xiàn)程將阻塞等待隊(duì)列騰空,直接影響業(yè)務(wù)方的效率

Logback

通過(guò)<queueSize>指定隊(duì)列長(zhǎng)度,Logback固定使用ArrayBlockingQueue作為隊(duì)列

Log4j2

通過(guò)

System.setProperty("log4j2.asyncLoggerRingBufferSize","x")

指定

二次方長(zhǎng)度

RingBuffer內(nèi)部計(jì)算位置時(shí)通過(guò)二進(jìn)制方式計(jì)算,使用二的指數(shù)長(zhǎng)度可以提高計(jì)算速度

長(zhǎng)度計(jì)算公式

暫未找到統(tǒng)一標(biāo)準(zhǔn)的計(jì)算公式,本人覺(jué)得可以通過(guò)(日志峰值TPS#消費(fèi)TPS)*15*60來(lái)計(jì)算

承載容量

這個(gè)公式的含義是:應(yīng)用15分鐘以峰值去生產(chǎn)的日志可以全部被隊(duì)列容納

成本

從成本的角度看,隊(duì)列不應(yīng)該無(wú)限量地預(yù)估,在保證系統(tǒng)不受到容量影響下,盡可能地使用小的長(zhǎng)度,節(jié)省內(nèi)存開(kāi)支

響應(yīng)時(shí)間

一般應(yīng)用不應(yīng)該長(zhǎng)時(shí)間在峰值運(yùn)行,如果出現(xiàn)長(zhǎng)時(shí)間在峰值運(yùn)行,則應(yīng)該進(jìn)行水平拓展分散請(qǐng)求壓力。因此容納15分鐘之內(nèi)的峰值,可以有足夠時(shí)間讓運(yùn)維響應(yīng),進(jìn)行水平拓展分散壓力。

消費(fèi)瓶頸

日志消費(fèi)TPS由Appender消費(fèi)效率決定,當(dāng)日志TPS超過(guò)消費(fèi)TPS時(shí),日志將開(kāi)始在隊(duì)列中堆積

消費(fèi)TPS

某個(gè)Appender在一秒內(nèi)消費(fèi)的日志數(shù)量,舉FileAppender為例,每條日志消費(fèi)花費(fèi)100微妙(性能好的主機(jī)可以到60),一秒可以消費(fèi)1萬(wàn)條日志,即消費(fèi)TPS為1萬(wàn)

請(qǐng)求TPS

一般Web應(yīng)用不會(huì)承載超過(guò)消費(fèi)TPS的流量。假設(shè)每個(gè)請(qǐng)求打印五條日志,則需要5000以上的TPS才能產(chǎn)生日志堆積

消費(fèi)者優(yōu)化

日志TPS長(zhǎng)時(shí)間(15min+)超過(guò)消費(fèi)TPS的場(chǎng)景下,應(yīng)該對(duì)消費(fèi)能力進(jìn)行優(yōu)化,使用輕量級(jí)的Appedner、簡(jiǎn)單的Layout、日志拋棄策略、過(guò)濾器、業(yè)務(wù)方規(guī)范等方面進(jìn)行優(yōu)化

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

相關(guān)文章

  • 淺談Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景

    淺談Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景

    數(shù)組可以存放多個(gè)同一類(lèi)型的數(shù)據(jù),可以存儲(chǔ)基本數(shù)據(jù)類(lèi)型,引用數(shù)據(jù)類(lèi)型(對(duì)象),下面這篇文章主要給大家介紹了關(guān)于Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2022-11-11
  • IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文(必看)

    IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文(必看)

    這篇文章主要介紹了IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文了,本文通過(guò)截圖的形式給大家展示,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • spring boot activiti工作流的搭建與簡(jiǎn)單使用

    spring boot activiti工作流的搭建與簡(jiǎn)單使用

    這篇文章主要給大家介紹了關(guān)于spring boot activiti工作流的搭建與簡(jiǎn)單使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    這篇文章主要介紹了Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解,就是String,StringBuilder以及StringBuffer這三個(gè)類(lèi)之間有什么區(qū)別呢,自己從網(wǎng)上搜索了一些資料,有所了解了之后在這里整理一下,便于大家觀(guān)看,需要的朋友可以參考下
    2023-12-12
  • SpringBoot選擇自有bean優(yōu)先加載實(shí)現(xiàn)方法

    SpringBoot選擇自有bean優(yōu)先加載實(shí)現(xiàn)方法

    在一些需求中,可能存在某些場(chǎng)景,比如先加載自己的bean,然后自己的bean做一些DB操作,初始化配置問(wèn)題,然后后面的bean基于這個(gè)配置文件,繼續(xù)做其他的業(yè)務(wù)邏輯。因此有了本文的這個(gè)題目
    2023-03-03
  • Spring?boot整合jsp和tiles模板示例

    Spring?boot整合jsp和tiles模板示例

    這篇文章主要介紹了Spring?boot整合jsp模板和tiles模板的示例演示過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • JDK  keytool證書(shū)工具功能代碼解析

    JDK keytool證書(shū)工具功能代碼解析

    這篇文章主要介紹了JDK keytool證書(shū)工具功能代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Spring MVC 攔截器實(shí)現(xiàn)登錄

    Spring MVC 攔截器實(shí)現(xiàn)登錄

    這篇文章主要介紹了Spring MVC 攔截器實(shí)現(xiàn)登錄,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • JavaWeb中web.xml初始化加載順序詳解

    JavaWeb中web.xml初始化加載順序詳解

    本篇文章主要介紹了JavaWeb中web.xml初始化加載順序詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java Optional解決空指針異常總結(jié)(java 8 功能)

    Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    這篇文章主要介紹了Java Optional解決空指針異??偨Y(jié)(java 8 功能),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論