log4jが言う事聞いてくれないんですよ。
まぁ、なんつーか、嬉しい悲鳴なわけですが。
log4jっていうのはロギングのAPIで、結構メジャー。
今までのプロジェクトでも使ってきた。
Categories, Appenders, Layouts っていう3つの要素をいい感じに使えば、
チョロっと設定変えるだけで、出力するログレベルとか変更できたり、
1日置きに日付の名前作って世代管理できたり、出力項目変えられたり。
ただ、ListとかMapとかでかいオブジェクトを吐き出したり、
なげぇStringBufferのtoString()したやつとか。
ログレベル変えたところで、ログが出ないだけで、
文字列操作の処理は走っちゃうから要注意なんだけど。
if文でisEnabledとかしたりObjectの配列渡したりするのが推奨されてたりします。
で、何をしてたかっていうと、こないだ処理の遅延があったんです。
結合テストの環境で。バッチがやけにおそい、と。
んでJavaのプロファイルをとってみたんです。
そしたら、SocketのWriteがえらい時間かかってて。
プロファイルのdepthを20にして実行してみたら、
log4jのクラスが出てきて。
んじゃぁ何やったら遅くなんのよっていう調査なわけです。
今回はバッチを多重で実行したりするもんで、
(Threadの多重じゃなくて、プロセスそのものを多重で実行)
でも、出力するログファイルは1つだから、
log4jのSimpleSocketServerっての使ってる。
(ソースコードみるとほんとにシンプル・・・)
前置きはそんなんで、いろいろいじめましたよ。
Server起動するJavaのヒープサイズをクソ小さくしたり、
クソでかいコレクション投げつけてみたり、
クライアントを200個とかイッキに起動してみたり。
複数のサーバーから1つのファイルに吐き出してみたり。
・・・全然、何やっても好調で。
クライアントを立ち上げまくったときなんか、CPU振り切ってんのに、
そこまで遅くならないし。。
今週いっぱいで調査の結果まとめてお客さんに
提出するつもりでいるんだけど、
結局再現できないっていう。。
納得してもらえるでしょうか・・・。
どんだけ調べても、英語のページみても、
全然log4j起因で遅延なんていうの聞いたことねぇし。
でもローカルサーバー内にlog4jのサーバー立ててるから
ネットワークの遅延っていうのも考えにくくて。
ってか安定してっからみんなlog4j使うんだよね、きっと。。。
つーか、今年、初の牡蠣食いました。ニヤ
うまかった・・・。ポッ
コメント