使用日誌可能會讓你的應用性能降低20% —— 很難相信吧,可是倒是真的可能。java
本文討論一些儘量提高日誌性能的方法,
2 關鍵設置緩存
這裏經過Junit,使用不一樣的Log4j配置來測試。下面會展現測試結果。實際上影響log4j性能的最主要因素有三:網絡
immediateFlush
bufferedIO
asycAppender
測試的結果可能和你想的不同。好比,使用asyncAppender會下降本地日誌文件的寫入性能;bufferedIO不怎麼樣影響性能除非日誌特別多;immediateFlush設爲false幾乎可使寫入時間減半。怎麼回事呢?咱們來看!異步
3 就是緩存async
上面三個都是使用緩存,他們分三級。第一級, immediateFlush=false
會開啓 java.io.Writer/java.io.OutputStreamWriter
的緩存,消息到達後會緩存最長1024字節。第二級 bufferedIO=true
會把 java.io.Writer
包裝成 java.io.BufferedWriter
,緩存默認大小是 1024*8 字節。第三級是 asyncAppender
,會緩存Log4j事件,默認是128條。
通常地,輸出流在使用的時候其餘寫入會被阻塞。使用緩存後能夠減小這種阻塞。可是若是原本就沒有阻塞(好比在寫入本地日誌的時候),使用緩存反而會延遲寫入。這樣講的話,使用緩存反而沒提高性能。因此性能調優要看狀況:你使用的是本地日誌仍是遠程日誌,什麼會形成資源競爭。性能
4 測試結果測試
這個測試很簡單,使用log4j輸出2560行,看看不一樣的配置使用的時間如何。咱們考察上面的三個因素:
每一個相同的測試咱們跑了三次。前三行結果是log4j的默認配置:同步+無緩存+當即刷入。第一條結果是157毫秒,咱們忽略它,由於它和後兩條(63毫秒,62毫秒)差距太大。
接下來三行 (63, 63, 62 milliseconds) 開啓了緩存可是仍是當即刷入。你可能想到這沒用,當即刷入讓緩存無用武之地。因此結果和前面一致仍是60多毫秒。
而後咱們看開啓緩存後不當即刷入,也就是 immediateFlush=false
,結果是(31, 32, 31 milliseconds)。差很少是前面的一半,好厲害!
若是關閉緩存不當即刷入呢?這個和上面結果同樣。
接下來看異步日誌。咱們關閉緩存而且當即刷入,結果是 (78, 78, 94 milliseconds)。異步日誌沒有改善性能,反而下降了咱們的性能。
最後,咱們使用異步日誌結合緩存打開、不當即刷入,結果是 (63, 47, 47 milliseconds) ,依然沒有同步的效果好。
恩?咋回事呢?spa
5 總結3d
Log4j性能建議 |
本地日誌:
|