現場から学ぶWebアプリ開発のトラブルハック 第8回
肥え続けるTomcatと
胃を痛めるトラブルハッカー
株式会社NTTデータ 基盤システム事業本部
茂呂 範
山下 真一
2007/11/27
本連載は、現場でのエンジニアの経験から得られた、APサーバをベースとしたWebアプリ開発における注意点やノウハウについて解説するハック集である。現在起きているトラブルの解決や、今後の開発の参考として大いに活用していただきたい(編集部) 。
今回の主な内容 |
メモリリークと聞いて、良いイメージを思い浮かべる開発者は少ないだろう。経験したことのある人にとっては、思い出したくない過去の記憶がよみがえるかもしれない。もしかしたら、その単語を聞くだけで胃が痛くなる人もいるかもしれない。筆者もかつてはその1人であった。
前々回の記事では、WebサーバとTomcatの間の接続において、スレッド数の不整合により発生したトラブル事例を、前回はTomcatとDBサーバの間のトラブル事例を紹介した。今回もTomcat上で起きたトラブルの事例で、聞くだけでも嫌なメモリリークの解析を単純なパズルで解けるようにしてくれるJavaVMのオプション、-XX:+PrintClassHistogramを紹介する。
知っているか? メモリリークの本当の“恐怖”を
長時間システムを稼働し続けると、思わぬトラブルが発生することがある。代表的なものとしてメモリリークが挙げられる。システム内でメモリリークが発生していたとしても、一見しただけでは正常に動作しているように見えてしまい、見過ごしているかもしれない。しかし、その裏では徐々にメモリが消費され、気が付いたときにはメモリ不足により、システムが停止へと追い込まれる。
■ どうです? 胃が痛くなってきませんか?
中でも、長期間連続稼働して初めて現象として表れるメモリリークは、本当に厄介なケースだ。さまざまな政治的・技術的な理由により、再起動による回避という運用対処ができない場合、メモリリークを直すしか手段がない。その場合を想像してみてほしい。
- まずは再現させないと。どれくらい運転すれば再現するのだろう?
- 1週間動かしてみたけど、この状況は再現しているのかなあ……
- もう3回目の再現試験だ。今度こそ再現してくれ!
- ダメだ! そもそも再現のための前提が間違っているのか!?
- 何とかそれっぽい事象が起きたけど、当時の状況証拠が足りなくて結局再現したか判断できないよ……
- 取りあえず、それっぽく直してみた。多分、これで大丈夫だよな?
- 事象再発。どうやら、違うところを直していたらしい……
(1ヘモドル)
確かに、この状況は極端な例かもしれない。しかし、トラブルに対応する前に、こうならないという予測を、誰が立てられるだろうか。今回のトラブルハックでは、まさにこの状況が起きかけていた現場をひっくり返した逆転満塁ホームランの事例とその解析方法を紹介する。
1カ月間かけて肥え続けるTomcatのヒープサイズ
■ トラブルの電話って早朝に鳴るものですよね
早朝に電話が鳴ると、大抵トラブル発生の連絡だ。その日も、とあるプロジェクトのマネージャから早朝に電話がかかってきた。電話の向こうでは、「メモリリーク!」「サービス停止!!」「●×☆仝&々仝!?」との怒号が飛び交っている。とにもかくにも、状況確認も含めて、現場へ急行することにした。
現場に到着し、担当者から状況を伺うと、次の情報を得られた。
- システム再起動によりサービスを再開した
- システム構成は、Apache・Tomcat・PostgreSQL構成である。Javaは1.4.2、Tomcatは5.0系を利用している
- 一次解析により、メモリリークが発生している可能性が高い
- しばらくは運用対処で乗り切るが、お客さまが本格対処を望まれている
素晴らしいことに、すでにトラブル切り分けフローに従い、メモリリークが発生しているところまで突き止めていた。
■ 思わず本音が
実際にGCログをGCViewerで視覚化した結果を確認すると、確かにメモリリークが発生していた。だが、そこには想像したくない目も覆いたくなるような世界が広がっていた。
編集部注:GCViewerについて詳しく知りたい読者は、連載第1回の 「その4:GCログ解析ツール」をご参照ください。
まずは、GCログを見てほしい。
![]() |
| 図1 1カ月かけて上昇するヒープサイズのGCViewr図(1)(画像をクリックすると拡大します) |
![]() |
| 図2 1カ月かけて上昇するヒープサイズのGCViewr図(2)(画像をクリックすると拡大します) |
![]() |
| 図3 1カ月かけて上昇するヒープサイズのGCViewr図(3)(画像をクリックすると拡大します) |
![]() |
| 図4 1カ月かけて上昇するヒープサイズのGCViewr図(4)(画像をクリックすると拡大します) |
ここで注目してほしいものは、横軸、すなわち起動時間だ。見えにくいかもしれないが、そこに記されていたものは、なんと25D、すなわち25日である。このグラフを確認した瞬間、「運用対処で逃げ続けたいですね」と思わず本音が漏れてしまった。
■ 作戦会議
さて、この時点で取るべき作戦はいくつかある。それを簡単にまとめてみた。
| 表 取るべき作戦 | ||
| 作戦名 | メリット | デメリット |
| 試験環境で再現するまでガンバルぞ〜 | ・商用サービスに影響を与えることがないため、さまざまな情報取得・解析用ツールの導入や検証・試験を行える ・再現方法が明確である場合、高い負荷を掛け続けるなど、期間を短縮して再現させることができる |
・再現方法が不明確の場合、再現したか否かの判断が難しく、また再現までの期間が見積もれずに、検証が長期化する恐れがある ・本番環境と同程度の環境でない場合、再現させることができない可能性がある |
| 本番環境でトラップを仕掛けて再現を待つぞ〜 | ・再現方法が不明確でも、確実に前回事象発生時と同じ程度の期間で再現させることができる | ・サービスに影響を与えるような大きな変更を加えることができないため、再現しても解析に必要な情報を取得できない場合がある |
試験環境での再現が王道だろう。25日かけて状況が悪化していたとはいえ、25日も再現に費やす必要はない。実際は、2〜3日程度連続運転すれば、事象は見えるだろう。しかし、現時点ではハッキリとした再現方法がなかった。
もし再現に失敗すれば……。その恐怖を抑えつつ、プロジェクト側と再現試験の段取りを始めた。
■ 何度も失敗する再現試験。そして漂う絶望感
再現試験の実施をプロジェクト側に任せ、しばらくは自席でリモートで解析する日々が続いた。そして、プロジェクトメンバから日々聞かされる再現失敗という報告に、頭を悩ませた。
連続運転の末に発生したメモリリークであり、これまでのトラブルハックの経験から、リクエスト処理を契機にメモリリーク発生していると考えていた。しかし試験環境では、いくら高い負荷を掛けても、メモリリークが再現しなかったのだ。
再現しなければ解析は始まらない。だが、再現させることができない。試験期間が足りないのか、負荷が足りないのか。現場からの報告も、日に日に覇気がなくなってきていた……。
| Index | |
| 第8回 肥え続けるTomcatと胃を痛めるトラブルハッカー | |
| Page1 知っているか? メモリリークの本当の“恐怖”を 1カ月間かけて肥え続けるTomcatのヒープサイズ |
|
| Page2 PrintClassHistogramオプションで、迷宮入りを防げ!! ObjectNameの上昇! まさかのメモリリーク |
|
| Page3 mod_jkのオプション1つでメモリリークが発生していた現実 PrintClassHistogramオプションの使いどころと注意点 |
|
現場から学ぶWebアプリ開発のトラブルハック バックナンバー 連載インデックスへ»
- 第1回 Webアプリの問題点を「見える化」する7つ道具
- 第2回 “Stop the World”を防ぐコンカレントGCとは?
- 第3回 【実録ドキュメント】そのログ本当に必要ですか?
- 第4回 DBアクセスのトラブルは終盤で発覚しがち……
- 第5回 OutOfMemoryエラー発生!? GCがあるのに、なぜ?
- 第6回 【真夏の夜のミステリー】Tomcatを殺したのは誰だ?
- 第7回 【トラブル大捜査線】失われたコネクションを追え!
- 第8回 肥え続けるTomcatと胃を痛めるトラブルハッカー
- 第9回 JavaのGC頻度に惑わされた年末年始の苦いメモリ
- 第10回 ThreadとHashMapに潜む無限回廊は実に面白い?
- 第11回 スレッドダンプの森で覚えた死のロックへの違和感
- 第12回 アプリ開発でも、よ〜く考えよう。キャッシュは大事だよ
- 第13回 DB操作の“壁”を壊すJPAが起こした「赤壁の戦い」
| Java Solution全記事一覧 |
ホワイトペーパー(TechTargetジャパン)
- Webの表示速度を遅くする「SSLハンドシェイク」とは (2010/2/9)
安全性を担保しようとWebページにSSLを適用すると、負荷の高い処理が実行される。速度と安全性は両立できるのか? - クラウド活用「雲活」のために押さえるべき39のポイント (2010/2/2)
活用するべきサービスか否か、クラウドの利点・問題点、クラウドプラットフォーム提供企業になるための条件、開発者がするべきことに分けて紹介 - 再利用性の高いクラス作成に重要な“アクセス制御” (2010/1/28)
Javaのアクセス修飾子public、private、protectedや、Eclipseで簡単に作れるアクセサメソッドgetter、setterについて解説 - DB設計の神ツール「ERMaster」なら、ここまでできる (2010/1/21)
直感的なUIに、カスタマイズ可能な、Excel出力のテーブル定義書、辞書機能など多機能なERモデリングの無料Eclipseプラグインです
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | 企業の仮想化に足りない“発想”とは? 仮想化運用管理のキモは意外なところに! New! |
| ◆ | 操作もマニュアルも分かりやすい! ユーザー視点で開発されたPC管理ツール New! |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |

| ◆ | セキュリティを知り尽くす上野氏が登壇! @ITメールソリューションLive! in Tokyo |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
| ◆ | 世界に通用するストレージの作り方とは? 製品に込めた思いを富士通の開発者に聞く |

| ◆ | OSSで手間も時間も、障害も減った―― 「マピオンの事例」オープンソース活用法 |
| ◆ | 「ノートPCの持ち出し禁止」で大丈夫? 情報漏えいを防ぐ管理手法とインフラは? |
| ◆ | 1日の処理を1秒に――MySQLの達人が語る 「コスト削減」できるチューニング |

| ◆ | ドキュメント作成を自動化して、SEの作業 効率を大幅アップ! Visio 2007の魅力 |
| ◆ | 急速に広がるHyper-Vでのサーバ仮想化 そのベストプラクティスをデルが解説 |
| ◆ | @IT主催セミナーで語られた、「担当者に 求められるセキュリティ対策」をレポート |

| ◆ | @IT「Windows 7」 特設サイトオープン! 最新情報・移行ノウハウを公開しています |










