做者:何甜甜在嗎
連接:juejin.im/post/6844903926777511943html
前段時間寫了一篇文章(Logback配置文件這麼寫,TPS提升10倍),反響還不錯,有不少網友也發表了本身的意見:java
意見1面試
意見2數據庫
意見三apache
總結一下就是:後端
看到網友的意見後又繼續去作了一波測試和調研網絡
CPU 六核多線程
內存 8G
JMeter
JProfile
APM(New Relic)
以前的測試結果存在如下幾點問題:
測試樣本數過少(即線程數和循環執行次數過少,以前線程數爲100,循環1次,樣本總數爲100)
測試次數過少,只進行了一次測試,結果存在偶然性
兩次測試結果存在污染,樣本數量不同
針對以上問題,從新測試中將線程數修改成200,每次測試中循環100次,樣本總數爲2w,和原來測試的樣本數相比擴大200倍,而且重複測試5次。新的測試結果以下:
logback同步和異步測試性能報告
新的測試結果代表,使用logback日誌框架同步和異步輸出日誌方式的TPS相差不大,推薦看下:log4j,logback,slf4j之間的關係。關注公衆號Java技術棧能夠看歷史更多幹貨。
把數據製做成柱形圖更直觀
logback同步和異步測試結果
可是總以爲異步去寫日誌了,訪問api的線程將更快響應客戶端,TPS就應該有明顯的變化纔對。
想不通又去網上查閱了一些資料,有反應說經過APM
進行性能監控,同步和異步的TPS將會有較大的差異,TPS必定是會有明顯變化的(吶喊),因而用APM去監控JMeter發送的請求(JMeter
參數設置爲線程數100,Ramp-up Period爲0,循環100次):APM測試結果以下:
APM-異步輸出日誌
APM監控下,在執行的五分鐘內異步輸出日誌TPS平均爲378rpm
APM-同步輸出日誌
APM監控下,在執行的五分鐘內同步輸出日誌TPS平均爲333rpm 發現TPS同步和異步相比仍是不明顯,又一次證實失敗 雖然想不明白但後來和網友探討了下,醍醐灌頂
我好菜啊
TPS變化不明顯的緣由以下:TPS爲每秒處理事務數,每一個事務包括了以下3個過程:
用戶請求服務器
服務器本身的內部處理
服務器返回給用戶
服務器本身的內部請求包括訪問數據庫、處理邏輯和打印日誌,同步和異步中惟一不一樣的就是打印日誌的方式。而從測試結果來看,打印日誌耗時只佔API訪問請求的5.3%,因此縮短打印日誌耗時不能很明顯的提升TPS,由於打印時間和網絡請求、業務處理消耗時間能夠忽略不計 可是測試結果代表,雖然使用異步輸出方式不能明顯提升TPS,可是可以減小打印日誌的耗時。因此使用logback日誌框架仍是推薦使用異步輸出方式
log4j2是log4j 1.x 的升級版,參考了logback的一些優秀的設計,而且修復了一些問題,帶來了一些重大的提高,在異步方面的性能獲得了巨大提高,其除了提供Async Append異步實現外還提供了Async Log異步實現,其中Async Append異步實現方式和logback的異步實現差很少,而Async Log基於LMAX Disruptor庫,實現了一個高性能的異步記錄器。
本次測試中log4j2異步實現是基於Async Log。JMeter測試參數和以前的logback測試同樣,線程數200,循環次數100,重複五輪。而且logj2日誌配置文件基本和logback異步配置相同,知足:
控制檯打印日誌
分類輸出日誌
按天滾動
一樣的日誌輸出格式
測試結果以下:
logback和log4j2異步測試性能報告
將TPS製做爲柱形圖
logback和log4j2異步測試結果
TPS提高了6倍!!!
而且打印日誌的耗時都快到統計不出來了 官方提供的測試報告中,log4j2和logback相比性能提高更明顯。
附官方測試報告:
https://logging.apache.org/log4j/log4j-2.3/manual/async.html
若是使用logback框架,推薦使用異步輸出日誌方式
選擇日誌框架,推薦使用log4j2
推薦去個人博客閱讀更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
以爲不錯,別忘了點贊+轉發哦!