您好,登錄后才能下訂單哦!
這篇文章主要介紹Logback和Log4j2日志框架性能對比與調(diào)優(yōu)方式的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
耗時
未經(jīng)過任何調(diào)優(yōu),采用Logback默認(rèn)配置得出上圖,一百萬條日志打印耗時(ms),如圖:單線程下性能最佳,耗時隨線程數(shù)增加而下降。
線程占用
單線程
無阻塞狀態(tài)
多線程
多線程打印日志時,會產(chǎn)生大量線程阻塞,線程越多阻塞狀態(tài)越多
四線程
八線程
十六線程
鎖占用
線程發(fā)生多次占用鎖的情況。查看Logback源碼可得知,檢查容量、放入隊(duì)列、取出隊(duì)列都需要在取得鎖后進(jìn)行
樣本數(shù)100萬,隊(duì)列長度110萬
耗時
線程占用
單線程
多線程
四線程
八線程
十六線程
鎖占用
每次寫入隊(duì)列都需要占用鎖,同時Appender從隊(duì)列取出也需要占用鎖
樣本數(shù)100萬,隊(duì)列長度50萬,不啟用拋棄策略
耗時
線程占用
單線程
多線程
寫入耗時明顯增長,寫入過程仍然發(fā)生阻塞狀態(tài)
四線程
八線程
十六線程
鎖占用
樣本數(shù)100萬,Logger到Appender串行執(zhí)行,輸出到文件
耗時
線程占用
線程產(chǎn)生長時間的等待,主要是緩沖環(huán)溢出后無法寫入,生產(chǎn)者根據(jù)等待策略進(jìn)入等待狀態(tài)
單線程
單線程生產(chǎn)不需要爭搶鎖,因此全程無阻塞
多線程
整體來看,阻塞的時間隨著線程增多而增多,因此多線程對同步日志影響極大,性能損失嚴(yán)重
四線程
八線程
十六線程
后續(xù)監(jiān)控因阻塞時間太長跳過
鎖占用
阻塞在Appender上的輸出流上,輸出流是在單線程中執(zhí)行的
樣本數(shù)100萬,隊(duì)列長度110萬,使用Yield等待策略
耗時
單線程占用最高,耗時隨線程數(shù)增加而縮短,直到線程數(shù)超過CPU核數(shù)。單線程耗時與logback相當(dāng),多線程耗時比logback縮短了2倍
線程占用
單線程與多線程使用都無阻塞狀態(tài),保證足夠的隊(duì)列容量,能使日志操作保持高吞吐和低延遲,避免阻塞等待
單線程
多線程
四線程
八線程
使用與宿主機(jī)CPU核數(shù)相等的線程數(shù),日志寫入過程無阻塞、無線程切換
十六線程
樣本數(shù)100萬,隊(duì)列長度50萬,啟用拋棄策略
耗時
線程占用
隊(duì)列長度50萬,正常來說應(yīng)與半隊(duì)列擴(kuò)容一樣,產(chǎn)生阻塞現(xiàn)象,但啟用了日志淘汰策略,無法寫入隊(duì)列的將直接拋棄不阻塞等待
單線程
多線程
四線程
八線程
十六線程
樣本數(shù)100萬,隊(duì)列長度50萬,使用Yield等待策略
耗時
當(dāng)隊(duì)列滿后,大幅影響了響應(yīng)時間,吞吐量依賴Appender的消費(fèi)性能
線程占用
單線程記錄日志時,前半段隊(duì)列未滿時生產(chǎn)線程一直處于工作狀態(tài),后半段因消費(fèi)能力跟不上生產(chǎn)能力,導(dǎo)致隊(duì)列滿載,生產(chǎn)線程開始出現(xiàn)等待狀態(tài)
單線程
等待的時間比多線程少,是因?yàn)閱尉€程下日志生產(chǎn)速度慢,同時日志也在倍消費(fèi)
多線程
前一段時間可以維持高性能工作,但后面隊(duì)列滿后開始發(fā)送等待,導(dǎo)致耗時延長
四線程
八線程
十六線程
鎖占用
并未發(fā)現(xiàn)日志記錄過程中發(fā)生鎖占用
樣本數(shù)100萬,隊(duì)列長度50萬,使用Timeout等待策略
耗時
線程占用
未產(chǎn)生阻塞狀態(tài)
單線程
多線程
因Timeout等待策略使用了鎖,因此產(chǎn)生一定的阻塞
四線程
八線程
十六線程
鎖占用
使用Timeout等待策略時,放入隊(duì)列前會取鎖,進(jìn)行消費(fèi)者線程喚醒動作
無論是logback還是log4j2,使用異步日志可以大幅提高日志操作耗時,間接提高業(yè)務(wù)方整體耗時
異步日志無法保證日志可靠性,系統(tǒng)意外關(guān)閉會丟失隊(duì)列中的日志,因此要求高可靠的日志,應(yīng)該選擇數(shù)據(jù)庫或者M(jìn)Q來保證
通過
<appender name="async-log-all" class="ch.qos.logback.classic.AsyncAppender">
設(shè)置
通過
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector")
設(shè)置
將溢出隊(duì)列的日志拋棄,保持穩(wěn)定的響應(yīng)速度。對業(yè)務(wù)方來說能保持良好、穩(wěn)定的日志服務(wù),但需要容忍一定的日志丟
通過
System.setProperty("log4j2.AsyncQueueFullPolicy","Discard")
設(shè)置
通過<discardingThreshold>指定拋棄日志的閾值
拋棄邊界
當(dāng)隊(duì)列剩余容量小于閾值后,將拋棄ERROR以下的日志
禁用拋棄策略
設(shè)置為0則表示不拋棄,業(yè)務(wù)線程等待隊(duì)列空間可用后寫入
默認(rèn)閾值
默認(rèn)閾值為隊(duì)列長度的20%,隊(duì)列長度100閾值為20
Log4j2獨(dú)有的特性,指定隊(duì)列滿時,生產(chǎn)者進(jìn)行等待的行為,需要在不開啟拋棄策略下進(jìn)行
Log4j2默認(rèn)的等待策略,通過Object.wait等待隊(duì)列騰空。在放入隊(duì)列時會加鎖,不推薦使用。
通過
System.setProperty("log4j2.asyncLoggerWaitStrategy","Yield")
設(shè)置。通過System.yield()等待隊(duì)列騰空,比Timeout等待策略更高效,比Busy等待策略更節(jié)能
由性能測試可知,不適用日志拋棄策略下,隊(duì)列滿載后生產(chǎn)線程將阻塞等待隊(duì)列騰空,直接影響業(yè)務(wù)方的效率
通過<queueSize>指定隊(duì)列長度,Logback固定使用ArrayBlockingQueue作為隊(duì)列
通過
System.setProperty("log4j2.asyncLoggerRingBufferSize","x")
指定
二次方長度
RingBuffer內(nèi)部計(jì)算位置時通過二進(jìn)制方式計(jì)算,使用二的指數(shù)長度可以提高計(jì)算速度
暫未找到統(tǒng)一標(biāo)準(zhǔn)的計(jì)算公式,本人覺得可以通過(日志峰值TPS#消費(fèi)TPS)*15*60來計(jì)算
承載容量
這個公式的含義是:應(yīng)用15分鐘以峰值去生產(chǎn)的日志可以全部被隊(duì)列容納
成本
從成本的角度看,隊(duì)列不應(yīng)該無限量地預(yù)估,在保證系統(tǒng)不受到容量影響下,盡可能地使用小的長度,節(jié)省內(nèi)存開支
響應(yīng)時間
一般應(yīng)用不應(yīng)該長時間在峰值運(yùn)行,如果出現(xiàn)長時間在峰值運(yùn)行,則應(yīng)該進(jìn)行水平拓展分散請求壓力。因此容納15分鐘之內(nèi)的峰值,可以有足夠時間讓運(yùn)維響應(yīng),進(jìn)行水平拓展分散壓力。
日志消費(fèi)TPS由Appender消費(fèi)效率決定,當(dāng)日志TPS超過消費(fèi)TPS時,日志將開始在隊(duì)列中堆積
某個Appender在一秒內(nèi)消費(fèi)的日志數(shù)量,舉FileAppender為例,每條日志消費(fèi)花費(fèi)100微妙(性能好的主機(jī)可以到60),一秒可以消費(fèi)1萬條日志,即消費(fèi)TPS為1萬
一般Web應(yīng)用不會承載超過消費(fèi)TPS的流量。假設(shè)每個請求打印五條日志,則需要5000以上的TPS才能產(chǎn)生日志堆積
日志TPS長時間(15min+)超過消費(fèi)TPS的場景下,應(yīng)該對消費(fèi)能力進(jìn)行優(yōu)化,使用輕量級的Appedner、簡單的Layout、日志拋棄策略、過濾器、業(yè)務(wù)方規(guī)范等方面進(jìn)行優(yōu)化
以上是“Logback和Log4j2日志框架性能對比與調(diào)優(yōu)方式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。