LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )

ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential
LogbackからLog4j 2への移行による
アプリケーションのスループット改善
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 1
アジェンダ
1.自己紹介
2.LogbackからLog4j 2へ変更した際のQPS
3.Log4j 2のloggerの特徴
4.アプリケーションでのベンチマーク結果
5.Log4j 2の注意事項
6.まとめ
ULS 2
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential
自己紹介
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 3
磯田 浩靖
- 所属:ウルシステムズ株式会社
- 連絡先:hironobu.isoda@ulsystems.co.jp
- twitter:hiroisojp
- Javaエンジニア、認定スクラムマスタ
自己紹介
ULS 4
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential
LogbackからLog4j 2へ変更した際のQPS
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 5
LogbackからLog4j 2へ変更した際のQPS
Logback
Log4j 2
同じアプリケーションコードでロギングライブラリを変更した際のQPSが
20%程度向上した
QPS = Queries Per Second、1秒間で処理できる件数
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 6
Log4j 2はLogbackとアーキテクチャが異なる
- Log4j 2 はロックフリーのデータ構造
- 内部でLMAX Disruptorというライブラリを用い、Ring Bufferを使ったデータ構造
- Logback はロック競合あり
- ArrayBlockingQueue
この違いによりQPSに差が出たのではないかと思われる
なぜQPSが向上したか
https://www.slideshare.net/Stephan.Schmidt/lmax-architecture-jax-conference
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 7
マルチスレッドであるほどロックフリーの恩恵が大きい
(参考)公式サイトのベンチマーク
https://logging.apache.org/log4j/2.x/performance.html
Logback
Log4j 2
ULS 8
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential
Log4j 2のloggerの特徴
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 9
Log4j2のloggerはsync/asyncがあり以下の組み合わせで設定できる
all loggers asyncが最もパフォーマンスがよい
利用する場合はJVMパラメータを指定する
- log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
all loggers async
種類 設定方法
sync log4j2.xmlにLoggerとして指定
<Logger name="foo.Bar" level="info"></Logger>
async log4j2.xmlにAsyncLoggerとして指定
<AsyncLogger name="foo.Baz" level="trace"></AsyncLogger>
mixed
sync/async
log4j2.xmlにLogger, AsyncLoggerをそれぞれ指定
all loggers
async
log4j2.xmlにLoggerとして指定+以下のJVMオプションを指定
-
Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.As
yncLoggerContextSelector
all loggers asyncが
最もパフォーマンスがよい
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 10
Log4j 2(2.6以降)ではガベージフリーなロギングが可能
ログ出力におけるGCが発生しにくい
ガベージフリーロギング
メモリ割り当て
が発生
メモリ割り当て
がほとんどない
2.5 2.6
https://logging.apache.org/log4j/2.x/manual/garbagefree.html
ULS 11
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential
アプリケーションでのベンチマーク結果
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 12
Log4j 2利用によるベンチマーク確認
ガベージフリーロギング
all loggers async
QPSが向上
するか
GC傾向が
変化するか
Log4j 2の特徴がアプリケーションにも寄与するかをベンチマークにて確認
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 13
オンライン広告入札を行うアプリケーション
- 秒間40万件のリクエストを処理(1台あたりは5k〜7k程度)
- 3〜5ms以内のレスポンス
リクエストごとに分析基盤で用いるログを出力している
アプリケーション概要
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 14
- 処理数
- 秒間5k〜7k
- 1行あたりのサイズ
- 1.6kb
- ファイルサイズ
- 1GB(1分間)
- アプリケーションスレッド数
- 84(CPUコア数 * 3)
アプリケーション概要(ログ周辺)
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 15
<appender name="ASYNC_FOO_LOG"
class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FOO_LOG" />
<queueSize>20000</queueSize>
<discardingThreshold>0</discardingThreshold>
</appender>
<appender name="FOO_LOG"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>foo.tsv</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>foo.%d{yyyy-MM-dd.HH-mm}.tsv
</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>
<![CDATA[%d{yyyy-MM-dd HH:mm:ss.SSS z}¥t%msg%n]]>
</pattern>
</encoder>
</appender>
Log4j 2、Logbackの設定概要
いずれもAsync Loggerにてログ出力処理を行う
Logback
Log4j 2
<RollingFile name="FOO_LOG" fileName="foo" filePattern="foo.%d{yyyy-
MM-dd.HH-mm}.tsv">
<PatternLayout>
<Pattern>
<![CDATA[%d{yyyy-MM-dd HH:mm:ss.SSS z}¥t%msg%n]]>
</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
logback.xml
log4j2.xml
(all loggers asyncを使う設定)
-
Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLogger
ContextSelector
-DAsyncLogger.WaitStrategy=busyspin
-DAsyncLogger.SynchronizeEnqueueWhenQueueFull=false
JVMオプション
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 16
Log4j 2、Logbackを利用した時のQPS
Logback
Log4j 2
QPS = Queries Per Second、1秒間で処理できる件数
Log4j 2 = 約6,000QPS
Logback = 約5,000QPS
ロギングライブラリの変更により20%程度の向上がみられた
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 17
負荷をかけている内の1時間、JFRを取得しFlameGraphで確認
Log4j 2ではログ出力処理に関する部分が高速化された
JFR(FlameGraph)
Logback
Log4j 2 幅が短いほうが、ある時間内の
処理時間の割合が低い=速い処理
Log4j 2より幅が広い
= 処理に時間がかかっている
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 18
ログ出力処理のみにフォーカスすると
LogbackではArrayBlockingQueue以降に時間を消費している
JFR(FlameGraph)
Logback
Log4j 2
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 19
10-20ms帯ではややLog4j 2の方がGCが短い傾向がみられた
GC傾向
Logback
Log4j 2
Logbackより短いGC
の割合が増えている
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 20
Log4j 2利用によるベンチマーク結果
ガベージフリーロギング
all loggers async
QPSが向上
するか
GC傾向が
変化するか
QPSは向上し、GC傾向も10-20ms帯でやや短くなる割合が増えた
Logback時よりもQPSは向上した
10-20ms帯で改善が少しみられた
ULS 21
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential
Log4j 2の注意事項
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 22
WaitStrategy、SynchronizeEnqueueWhenQueueFullの設定によっても
FlameGraphの結果はかなり変わるのでアプリケーションにあった組み合わ
せを探索する
WaitStrategyの種類
- timeout(デフォルト)
- block
- sleep
- yield
- busyspin
SynchronizeEnqueueWhenQueueFull
- true/false
all loggers asyncに関する注意事項
https://logging.apache.org/log4j/2.x/manual/async.html
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 23
WaitStrategy、SynchronizeEnqueueWhenQueueFullの組み合わせによる
FlameGraphの例
all loggers asyncに関する注意事項
JVMパラメータ FlameGraph(赤枠内はlog4j 2の処理部分)
AsyncLogger.WaitStrategy=busyspin
AsyncLogger.SynchronizeEnqueueWhenQueueFull=false
AsyncLogger.WaitStrategy=timeout
AsyncLogger.WaitStrategy=busyspin
AsyncLogger.SynchronizeEnqueueWhenQueueFull=true
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 24
Webアプリケーション(javax.servlet.Servletがクラスパスに存在する)の
場合、デフォルトは低ガベージモードとなる
(log4j2.enable.threadlocalsがfalseに設定される)
ガベージフリーに関する注意事項
https://logging.apache.org/log4j/2.x/manual/garbagefree.html
JVMパラメータ モード
log4j2.enable.threadlocals=true
log4j2.enable.direct.encoders=true
ガベージフリー
log4j2.enable.threadlocals=false
log4j2.enable.direct.encoders=true
低ガベージ
log4j2.enable.threadlocals=false
log4j2.enable.direct.encoders=false
クラシック
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 25
ログ出力時に%d(日付)などPatternを指定し値を変換することができる
このうち位置情報を含むPatternを用いるとパフォーマンスが大きく落ちる
Patternに関する注意事項
Pattern 出力例
%C or %class foo.Bar
%F or %file Bar.java
%l or %location foo.Bar.exec(Bar.java:123)
%L or %line 123
%M or %method exec
位置情報を含むPattern
Asyncのときにも
パフォーマンス影響
が大きい
https://logging.apache.org/log4j/2.x/performance.html#asyncLoggingWithLocation
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 26
ほぼそのまま移行できたため、大きな問題はなかった
アプリケーションで利用していた範囲ではif conditionのみ影響があった
(設定ファイル自体を分けて対応)
<if condition='property("type").contains("staging")'>
<then>
(ステージング環境用の設定)
</then>
<else>
(本番環境用の設定)
</else>
</if>
Log4j 2では左記のLogbackの
ように条件分岐できない
(参考)ログ設定ファイルの移行
logback.xml
ULS 27
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential
まとめ
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 28
- アプリケーションのQPSが向上 & GCも多少改善した
- Logbackからロギングライブラリの置き換えを試して見る価値あり
- 何度か計測して同じ傾向であったことは確認済
- Log4j 2 Async, ガベージフリーの恩恵は設定や環境制約がある
- WaitStrategyのチューニングをする
- ガベージフリーはWebアプリケーションではデフォルトは低ガベージモードとなる
ので、ガベージフリーモードが利用できるかをチェック
- ログ出力時のPatternに位置情報を含めないようにする
まとめ
ULS
Copyright © 2011-2021 UL Systems, Inc. All rights reserved.
Proprietary & Confidential 29
1 of 30

Recommended

マイクロにしすぎた結果がこれだよ! by
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
132.6K views32 slides
Javaのログ出力: 道具と考え方 by
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
74.3K views67 slides
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 by
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
148.6K views45 slides
Java ORマッパー選定のポイント #jsug by
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
90.1K views66 slides
BuildKitによる高速でセキュアなイメージビルド by
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
42.6K views27 slides
Dockerからcontainerdへの移行 by
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
16.6K views36 slides

More Related Content

What's hot

SPAセキュリティ入門~PHP Conference Japan 2021 by
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
99.5K views107 slides
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える by
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
65.3K views119 slides
AWSのログ管理ベストプラクティス by
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAkihiro Kuwano
77.2K views57 slides
こわくない Git by
こわくない Gitこわくない Git
こわくない GitKota Saito
881.4K views186 slides
世界一わかりやすいClean Architecture by
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
47.1K views77 slides
「速」を落とさないコードレビュー by
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
55.5K views62 slides

What's hot(20)

SPAセキュリティ入門~PHP Conference Japan 2021 by Hiroshi Tokumaru
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru99.5K views
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える by pospome
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome65.3K views
AWSのログ管理ベストプラクティス by Akihiro Kuwano
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano77.2K views
こわくない Git by Kota Saito
こわくない Gitこわくない Git
こわくない Git
Kota Saito881.4K views
世界一わかりやすいClean Architecture by Atsushi Nakamura
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura47.1K views
「速」を落とさないコードレビュー by Takafumi ONAKA
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
Takafumi ONAKA55.5K views
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話 by Koichiro Matsuoka
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka88.1K views
Redisの特徴と活用方法について by Yuji Otani
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani101.5K views
イミュータブルデータモデル(入門編) by Yoshitaka Kawashima
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima185.8K views
マイクロサービスバックエンドAPIのためのRESTとgRPC by disc99_
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_19.9K views
これからSpringを使う開発者が知っておくべきこと by 土岐 孝平
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平21.5K views
ソーシャルゲーム案件におけるDB分割のPHP実装 by infinite_loop
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
infinite_loop51.8K views
ストリーム処理を支えるキューイングシステムの選び方 by Yoshiyasu SAEKI
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI40.2K views
爆速クエリエンジン”Presto”を使いたくなる話 by Kentaro Yoshida
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話
Kentaro Yoshida27.5K views
DockerとPodmanの比較 by Akihiro Suda
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
Akihiro Suda47.9K views
Twitterのsnowflakeについて by moai kids
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids24.8K views
エンジニアの個人ブランディングと技術組織 by Takafumi ONAKA
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA23.3K views
ドメイン駆動設計のための Spring の上手な使い方 by 増田 亨
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨138K views
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring) by Koichiro Matsuoka
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
Koichiro Matsuoka15.4K views
Linux女子部 systemd徹底入門 by Etsuji Nakai
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
Etsuji Nakai137.9K views

Similar to LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )

XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with... by
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...Kousuke Ebihara
21.9K views91 slides
Firefox5+HTML5×5 by
Firefox5+HTML5×5Firefox5+HTML5×5
Firefox5+HTML5×5dynamis
2.1K views84 slides
企業におけるSpring@日本springユーザー会20090624 by
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
1.9K views36 slides
Intalio Cloud Workshop by
Intalio Cloud Workshop Intalio Cloud Workshop
Intalio Cloud Workshop Daisuke Sugai
10K views77 slides
Rails and twitter #twtr_hack by
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hacki7a
1.3K views34 slides
Lightweight Keycloak by
Lightweight KeycloakLightweight Keycloak
Lightweight KeycloakHiroyuki Wada
1.2K views30 slides

Similar to LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall ) (20)

XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with... by Kousuke Ebihara
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...
Kousuke Ebihara21.9K views
Firefox5+HTML5×5 by dynamis
Firefox5+HTML5×5Firefox5+HTML5×5
Firefox5+HTML5×5
dynamis 2.1K views
企業におけるSpring@日本springユーザー会20090624 by Yusuke Suzuki
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
Yusuke Suzuki1.9K views
Intalio Cloud Workshop by Daisuke Sugai
Intalio Cloud Workshop Intalio Cloud Workshop
Intalio Cloud Workshop
Daisuke Sugai10K views
Rails and twitter #twtr_hack by i7a
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hack
i7a1.3K views
20120822_dstn技術交流会_dstnのご紹介と最新技術情報 by dstn
20120822_dstn技術交流会_dstnのご紹介と最新技術情報20120822_dstn技術交流会_dstnのご紹介と最新技術情報
20120822_dstn技術交流会_dstnのご紹介と最新技術情報
dstn1.3K views
5分でわかる!ownCloudアドオンの作り方 by Yuki Takahashi
5分でわかる!ownCloudアドオンの作り方5分でわかる!ownCloudアドオンの作り方
5分でわかる!ownCloudアドオンの作り方
Yuki Takahashi3.8K views
Pycon2014 django performance by hirokiky
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performance
hirokiky12.4K views
Lpicl300セミナー資料_20170218(鯨井貴博) by Takahiro Kujirai
Lpicl300セミナー資料_20170218(鯨井貴博)Lpicl300セミナー資料_20170218(鯨井貴博)
Lpicl300セミナー資料_20170218(鯨井貴博)
Takahiro Kujirai545 views
Develop Web Application with Node.js + Express by Akinari Tsugo
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
Akinari Tsugo394 views
QCon北京2015 sina jpool-微博平台自动化运维实践 by Weibo Corporation
QCon北京2015 sina jpool-微博平台自动化运维实践QCon北京2015 sina jpool-微博平台自动化运维实践
QCon北京2015 sina jpool-微博平台自动化运维实践

Recently uploaded

JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私修治 松浦
122 views36 slides
how query cost affects search behavior translated in JP by
how query cost affects search behavior translated in JPhow query cost affects search behavior translated in JP
how query cost affects search behavior translated in JPTobioka Ken
9 views16 slides
システム概要.pdf by
システム概要.pdfシステム概要.pdf
システム概要.pdfTaira Shimizu
40 views1 slide
onewedge_companyguide1 by
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1ONEWEDGE1
27 views22 slides
lt.pptx by
lt.pptxlt.pptx
lt.pptxtomochamarika
80 views13 slides
AIで始めるRustプログラミング #SolDevHub by
AIで始めるRustプログラミング #SolDevHubAIで始めるRustプログラミング #SolDevHub
AIで始めるRustプログラミング #SolDevHubK Kinzal
22 views25 slides

Recently uploaded(9)

JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by 修治 松浦
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
修治 松浦122 views
how query cost affects search behavior translated in JP by Tobioka Ken
how query cost affects search behavior translated in JPhow query cost affects search behavior translated in JP
how query cost affects search behavior translated in JP
Tobioka Ken9 views
onewedge_companyguide1 by ONEWEDGE1
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1
ONEWEDGE127 views
AIで始めるRustプログラミング #SolDevHub by K Kinzal
AIで始めるRustプログラミング #SolDevHubAIで始めるRustプログラミング #SolDevHub
AIで始めるRustプログラミング #SolDevHub
K Kinzal22 views
図解で理解するvetKD by ryoo toku
図解で理解するvetKD図解で理解するvetKD
図解で理解するvetKD
ryoo toku86 views
Najah Matsuo Self Introduction by NajahMatsuo
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self Introduction
NajahMatsuo7 views

LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )

  • 1. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential LogbackからLog4j 2への移行による アプリケーションのスループット改善
  • 2. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 1 アジェンダ 1.自己紹介 2.LogbackからLog4j 2へ変更した際のQPS 3.Log4j 2のloggerの特徴 4.アプリケーションでのベンチマーク結果 5.Log4j 2の注意事項 6.まとめ
  • 3. ULS 2 Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 自己紹介
  • 4. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 3 磯田 浩靖 - 所属:ウルシステムズ株式会社 - 連絡先:hironobu.isoda@ulsystems.co.jp - twitter:hiroisojp - Javaエンジニア、認定スクラムマスタ 自己紹介
  • 5. ULS 4 Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential LogbackからLog4j 2へ変更した際のQPS
  • 6. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 5 LogbackからLog4j 2へ変更した際のQPS Logback Log4j 2 同じアプリケーションコードでロギングライブラリを変更した際のQPSが 20%程度向上した QPS = Queries Per Second、1秒間で処理できる件数
  • 7. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 6 Log4j 2はLogbackとアーキテクチャが異なる - Log4j 2 はロックフリーのデータ構造 - 内部でLMAX Disruptorというライブラリを用い、Ring Bufferを使ったデータ構造 - Logback はロック競合あり - ArrayBlockingQueue この違いによりQPSに差が出たのではないかと思われる なぜQPSが向上したか https://www.slideshare.net/Stephan.Schmidt/lmax-architecture-jax-conference
  • 8. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 7 マルチスレッドであるほどロックフリーの恩恵が大きい (参考)公式サイトのベンチマーク https://logging.apache.org/log4j/2.x/performance.html Logback Log4j 2
  • 9. ULS 8 Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential Log4j 2のloggerの特徴
  • 10. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 9 Log4j2のloggerはsync/asyncがあり以下の組み合わせで設定できる all loggers asyncが最もパフォーマンスがよい 利用する場合はJVMパラメータを指定する - log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector all loggers async 種類 設定方法 sync log4j2.xmlにLoggerとして指定 <Logger name="foo.Bar" level="info"></Logger> async log4j2.xmlにAsyncLoggerとして指定 <AsyncLogger name="foo.Baz" level="trace"></AsyncLogger> mixed sync/async log4j2.xmlにLogger, AsyncLoggerをそれぞれ指定 all loggers async log4j2.xmlにLoggerとして指定+以下のJVMオプションを指定 - Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.As yncLoggerContextSelector all loggers asyncが 最もパフォーマンスがよい
  • 11. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 10 Log4j 2(2.6以降)ではガベージフリーなロギングが可能 ログ出力におけるGCが発生しにくい ガベージフリーロギング メモリ割り当て が発生 メモリ割り当て がほとんどない 2.5 2.6 https://logging.apache.org/log4j/2.x/manual/garbagefree.html
  • 12. ULS 11 Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential アプリケーションでのベンチマーク結果
  • 13. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 12 Log4j 2利用によるベンチマーク確認 ガベージフリーロギング all loggers async QPSが向上 するか GC傾向が 変化するか Log4j 2の特徴がアプリケーションにも寄与するかをベンチマークにて確認
  • 14. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 13 オンライン広告入札を行うアプリケーション - 秒間40万件のリクエストを処理(1台あたりは5k〜7k程度) - 3〜5ms以内のレスポンス リクエストごとに分析基盤で用いるログを出力している アプリケーション概要
  • 15. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 14 - 処理数 - 秒間5k〜7k - 1行あたりのサイズ - 1.6kb - ファイルサイズ - 1GB(1分間) - アプリケーションスレッド数 - 84(CPUコア数 * 3) アプリケーション概要(ログ周辺)
  • 16. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 15 <appender name="ASYNC_FOO_LOG" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="FOO_LOG" /> <queueSize>20000</queueSize> <discardingThreshold>0</discardingThreshold> </appender> <appender name="FOO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>foo.tsv</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>foo.%d{yyyy-MM-dd.HH-mm}.tsv </fileNamePattern> </rollingPolicy> <encoder> <pattern> <![CDATA[%d{yyyy-MM-dd HH:mm:ss.SSS z}¥t%msg%n]]> </pattern> </encoder> </appender> Log4j 2、Logbackの設定概要 いずれもAsync Loggerにてログ出力処理を行う Logback Log4j 2 <RollingFile name="FOO_LOG" fileName="foo" filePattern="foo.%d{yyyy- MM-dd.HH-mm}.tsv"> <PatternLayout> <Pattern> <![CDATA[%d{yyyy-MM-dd HH:mm:ss.SSS z}¥t%msg%n]]> </Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> </Policies> </RollingFile> logback.xml log4j2.xml (all loggers asyncを使う設定) - Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLogger ContextSelector -DAsyncLogger.WaitStrategy=busyspin -DAsyncLogger.SynchronizeEnqueueWhenQueueFull=false JVMオプション
  • 17. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 16 Log4j 2、Logbackを利用した時のQPS Logback Log4j 2 QPS = Queries Per Second、1秒間で処理できる件数 Log4j 2 = 約6,000QPS Logback = 約5,000QPS ロギングライブラリの変更により20%程度の向上がみられた
  • 18. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 17 負荷をかけている内の1時間、JFRを取得しFlameGraphで確認 Log4j 2ではログ出力処理に関する部分が高速化された JFR(FlameGraph) Logback Log4j 2 幅が短いほうが、ある時間内の 処理時間の割合が低い=速い処理 Log4j 2より幅が広い = 処理に時間がかかっている
  • 19. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 18 ログ出力処理のみにフォーカスすると LogbackではArrayBlockingQueue以降に時間を消費している JFR(FlameGraph) Logback Log4j 2
  • 20. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 19 10-20ms帯ではややLog4j 2の方がGCが短い傾向がみられた GC傾向 Logback Log4j 2 Logbackより短いGC の割合が増えている
  • 21. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 20 Log4j 2利用によるベンチマーク結果 ガベージフリーロギング all loggers async QPSが向上 するか GC傾向が 変化するか QPSは向上し、GC傾向も10-20ms帯でやや短くなる割合が増えた Logback時よりもQPSは向上した 10-20ms帯で改善が少しみられた
  • 22. ULS 21 Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential Log4j 2の注意事項
  • 23. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 22 WaitStrategy、SynchronizeEnqueueWhenQueueFullの設定によっても FlameGraphの結果はかなり変わるのでアプリケーションにあった組み合わ せを探索する WaitStrategyの種類 - timeout(デフォルト) - block - sleep - yield - busyspin SynchronizeEnqueueWhenQueueFull - true/false all loggers asyncに関する注意事項 https://logging.apache.org/log4j/2.x/manual/async.html
  • 24. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 23 WaitStrategy、SynchronizeEnqueueWhenQueueFullの組み合わせによる FlameGraphの例 all loggers asyncに関する注意事項 JVMパラメータ FlameGraph(赤枠内はlog4j 2の処理部分) AsyncLogger.WaitStrategy=busyspin AsyncLogger.SynchronizeEnqueueWhenQueueFull=false AsyncLogger.WaitStrategy=timeout AsyncLogger.WaitStrategy=busyspin AsyncLogger.SynchronizeEnqueueWhenQueueFull=true
  • 25. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 24 Webアプリケーション(javax.servlet.Servletがクラスパスに存在する)の 場合、デフォルトは低ガベージモードとなる (log4j2.enable.threadlocalsがfalseに設定される) ガベージフリーに関する注意事項 https://logging.apache.org/log4j/2.x/manual/garbagefree.html JVMパラメータ モード log4j2.enable.threadlocals=true log4j2.enable.direct.encoders=true ガベージフリー log4j2.enable.threadlocals=false log4j2.enable.direct.encoders=true 低ガベージ log4j2.enable.threadlocals=false log4j2.enable.direct.encoders=false クラシック
  • 26. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 25 ログ出力時に%d(日付)などPatternを指定し値を変換することができる このうち位置情報を含むPatternを用いるとパフォーマンスが大きく落ちる Patternに関する注意事項 Pattern 出力例 %C or %class foo.Bar %F or %file Bar.java %l or %location foo.Bar.exec(Bar.java:123) %L or %line 123 %M or %method exec 位置情報を含むPattern Asyncのときにも パフォーマンス影響 が大きい https://logging.apache.org/log4j/2.x/performance.html#asyncLoggingWithLocation
  • 27. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 26 ほぼそのまま移行できたため、大きな問題はなかった アプリケーションで利用していた範囲ではif conditionのみ影響があった (設定ファイル自体を分けて対応) <if condition='property("type").contains("staging")'> <then> (ステージング環境用の設定) </then> <else> (本番環境用の設定) </else> </if> Log4j 2では左記のLogbackの ように条件分岐できない (参考)ログ設定ファイルの移行 logback.xml
  • 28. ULS 27 Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential まとめ
  • 29. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 28 - アプリケーションのQPSが向上 & GCも多少改善した - Logbackからロギングライブラリの置き換えを試して見る価値あり - 何度か計測して同じ傾向であったことは確認済 - Log4j 2 Async, ガベージフリーの恩恵は設定や環境制約がある - WaitStrategyのチューニングをする - ガベージフリーはWebアプリケーションではデフォルトは低ガベージモードとなる ので、ガベージフリーモードが利用できるかをチェック - ログ出力時のPatternに位置情報を含めないようにする まとめ
  • 30. ULS Copyright © 2011-2021 UL Systems, Inc. All rights reserved. Proprietary & Confidential 29