低負荷なのにCPU使用率が100%?事例に学ぶWebシステム開発のワンポイント(7)

本連載では、現場でのエンジニアの経験から得られた、アプリケーション・サーバをベースとしたWebシステム開発における注意点やヒントについて解説する。巷のドキュメントではなかなか得られない貴重なノウハウが散りばめられている。読者の問題解決や今後システムを開発する際の参考として大いに活用していただきたい。(編集局)

» 2002年12月11日 00時00分 公開
[田中秀彦(株)NTTデータ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

今回のワンポイント

アプリケーション・サーバ上でアプリケーションを稼働中に、大きな負荷がかかっていないにもかかわらず、CPUの使用率が100%になってしまうときがある。こんなときに役立つのは、スレッドダンプだ。スレッドダンプは、実行中のスレッドスタックを取得できるため、そのとき何が起きているのかを解析するには最適である。スレッドダンプの結果、原因は、java.ioパッケージ内のクラスの使い方による問題であることが判明した。これは、一般にも多く作成されているであろうダウンロードやアップロード処理で見掛けるコードの一部でもある。今回は、トラブル発生時の原因究明に役立つスレッドダンプの解説と、問題の原因となったjava.ioパッケージの使い方が引き起こす、非常に特定しにくい事象について紹介する。


低負荷なのに、CPU使用率100%

  アプリケーションに大きな負荷をかけていないのに、突然CPU使用率が100%に達してしまうという事象が発生した。貴重なCPUリソースを使うということで大きな問題となりすぐに調査を開始した。

 高負荷な状態では、CPU使用率が慢性的に100%になることがある。低負荷な状態でも、処理が重ければ一時的にCPU使用率が100%となることがある。しかし今回は、ほとんど負荷をかけていない状態で突然CPU使用率が100%になり、それ以降100%の状態が継続するという特徴があった。CPU使用率には、ユーザーモードとシステムモード(カーネルモード)があるが、この場合ユーザーモードの使用率が100%であるという特徴もあった。

原因は無限ループ?

 一般に、ユーザーモードが100%という現象は無限ループ状態で起こる。例えば、以下のようなJSPのコードを作成し、実行してみれば分かる。JSPで記述しているが、JavaアプリケーションやCなどほかのプログラミング言語でも同様である。なお、CPU使用率の確認は、UNIX環境ではvmstatやsarコマンドで、Windows環境ではタスクマネージャやパフォーマンスモニタなどで調べられる。

<%
    while (true) ;
%>

 今回の場合も事象から判断して無限ループを疑った。しかし、実際にはどのリクエストで無限ループが発生しているのか特定できず、ソースコードチェックを行うにも膨大な時間と労力を費やすことが考えられた。

そのとき何が起きていたのか?

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。