2018年9月21日金曜日

【SEの仕事】原因不明なエラーの解析【Java】【C#】

お客さんの都合により、複数の会社が同じWebアプリ内の機能を作成する事があります。もちろんそれぞれの会社の作成している機能は別物です。

OutOfMemoryErrorや原因が不明なエラーが発生した場合にどの会社が解析するのかと言う問題があります。

お客さんが事前にどの会社がやるのか決めてくれている場合は良いんですが、そうでない場合が厄介で、本来であれば契約に従う必要があり、契約書に無いことをやってはいけません。が、どの会社も契約してない場合は誰かがやるしかないんです。

しかし、誰もやろうとしないんですよね。
恩を売る、または勉強と割り切って自分で実施しましょう。やって見ないといつまでも機会がありません。こういうバグの解析は稀にしかありません。なぜなら、かなり出来る人間が毎回解析するため。年次が高くなっても出来ないと困ったことになります。プロジェクトを任されて、外のメンバーは1~3年目のみとか詰みます。

■解析方法
JavaやC#のExceptionがログファイルに出ていれば、ソースコードのファイル名と行番号からエラーが特定出来ます。

今回はそうではなく、良く分からないエラーの場合です。
良く分からないエラーって何です?って思いますよね?

例えば、定期処理が動かなくなったとか、画面にもログファイルにも何も出てないが操作が出来ないとか、操作が途中で止まるとか、砂時計のままとか、少し違和感があるとか、異常に遅いとか、・・・。

Exceptionが出てない場合はエラー箇所が分からないため、ソースコードのどこに問題があるのか分からなかったりします。この場合、見るべきことが沢山あります。主なものを以下に記載します。

●Javaの場合
・ログファイル
 エラーが発生したと思われる時間帯の前のログなど。ログファイルは膨大なのでgrep、egrep、head、tail、unique、cut、sort、sed、awk、viewなどのテキスト関連のコマンド、サクラエディタ※1の正規表現置換、ブロック選択、Excelなどを駆使してエラー箇所を絞り込み、エラーの特定、そこまで行かなくても何の処理が動いてたかを把握して解析の取っ掛かりにしたりします。

・Catalina.out
 まずはOutOfMemoryErrorでgrep。Catalina.outも大量にログが出てる場合があります。なのでログファイルと同様の解析をしたりします。皆なんでCatalina.outに余計なログ出すかなあ?Catalina.outはOutOfMemoryとかErrorの子クラスだけにして欲しい。それ以外はロガーに出してくれ。

・リソース使用量
 ・sar
  サーバーのcpu使用量。グラフ化すれば、おかしくなり始めた時間帯などを特定出来ます。

 ・top
  現在の各プロセスのCPU使用量、メモリ使用量。

 ・ps
  スレッド数、ファイルディスクリプタ数などを調べられる。出来れば事前に定期観測しておく。

 ・free(Javaでは余り見ない)
  サーバーのメモリ使用量。

 ・iostat、vmstat記録してたが何に使ったっけ?

 ・コネクション数
  DBコネクション数が限界に達してないか?定期的に記録しておきましょう。何のコマンドだったな?vmstat?netstat?

 ・jconsole
  JavaのCPU使用量、ヒープ使用量、メモリ使用量。

 ・jstat
 ヒープ使用量定期観測。事前に仕掛けておく。

 ・ヒープ内の各クラスのメモリ使用量。コマンド名は何だったかな?
  メモリリークの場合、どのクラスがリークしてるか分かるので必須です。特に正常時と異常時の比較、起動直後と時間経過後の比較をすると、あっさり原因特定出来たりします。

・jstack
 ・スレッドの状態(最近はスレッド数が多くて一苦労)
 ・スタックの状態
 ・ロック残り、デッドロックの有無

●Windowsの場合
・タスクマネージャー
 windows用。列追加すると色々見られる。プロセスのCPU使用量、メモリ使用量、ファイルディスクリプタ、スレッド数、GDIオブジェクトなどのリーク。

・リソースマネージャー
 タスクマネージャーより詳しく見られるらしい。余り使ったこと無い。

・typeperf
 プロセスのCPU、メモリ使用量、ファイルディスクリプタ、スレッド数などを定期観測。事前にしかけておく。何れも増え続けているものは注意。typeperfはGDIオブジェクトが記録出来ない。何でだ?

●DBがある場合(製品によって確認方法が違うのでざっくり記載。)
・トランザクション残り
 デッドロックやトランザクション残りの特定。
 実行中のselect文が見られる場合があり、問題のある機能が特定出来る。また、手動でinsert文実行時にトランザクション途中でウィンドウを閉じて、トランザクションが残ってしまい、他の機能が動かない問題などの特定。トランザクション残りって呼んでますが、本当は何て呼ぶんでしょう?

・ロック残り
 トランザクション残りとほぼ同じ。デッドロックの特定。

怪しい箇所は時系列順にメモして、最初のエラーを特定します。リーク系は最初ではなく、時系列でみます。
また、正常時との比較も重点です。

※1 他のエディタでもいいですが、巨大なログファイルを扱える必要があります。サクラエディタは結構耐えてくれます。分割してもいいですが。

0 件のコメント:

コメントを投稿