OpenShiftのLibertyコンテナでトランザション処理中、バックエンドのDb2 pureScaleへの接続処理が極端に遅延する事象に遭遇したので、メモ。
構成
- WebSphere Liberty 24.0.0.6(OpenShift)
- sysplexWLB(Workload Balancing) を有効化
- Db2 pureScale (AIX / 4メンバー構成)
事象
全トランザクション中約1%程度で、DB接続処理に1秒以上の遅延が発生していた。
原因
アプリログおよびJDBCトレースを解析し、「pureScale側のServerList更新処理」と「Liberty側のServerList取得処理」の競合が原因であると判明。
- pureScale側は5秒ごとにServerListを更新する際、一時的にリソースをロック(あるいは更新完了まで応答を保留)する
- Liberty側は10秒ごとにリストを取得する
- Libertyがリストを取得しに行ったタイミングが、たまたまpureScale側の更新処理中だった場合、更新が完了するまでLiberty側が待たされる(ブロックされる)
対応
1. JDBCドライバのバージョンアップ
JDBCドライバのバージョンは4.33.32だったが、4.34.30に更新。
4.34.30では「ServerListの更新中に取得リクエストが来た場合、更新の完了を待たずに直前のリストを使用して即座に応答する」という機能が実装されているため。
結果として約200ms程度の遅延改善。
2. AIX LPARのCPUモード変更
現行設計ではAIXのLPAR(論理区画)はCPUリソースを他の区画と共有するSharedとなっていたが、これをDedicatedに変更。
結果、1秒以上の遅延発生率は 0.01% 以下にまで減少。
ServerList更新スレッドがCPUを専有できるようになり、更新処理およびLibertyへの応答が瞬時に完了するようになったと思われる。