人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Tomcatで動くJavaのWebアプリの動作が重くなって困ってます

Web/AP機とDB機の2台構成で、SAStrutsで作ったWebアプリを動かしてます。CentOS,Apache,Tomcat,MySQLです。

起動直後はいい感じですが、使ってるうちに重くなります。重くなると、ごく簡単なページですら表示に数分かかります。

重くなるきっかけは、アプリ内の検索機能で結果が大量(100万件以上)になる検索をされたときです。そのリクエスト自体に時間がかかるのは仕方ないとして、その後の他の関係ないリクエストも含めて全体が重くなってしまいます。その都度Tomcat再起動をすると軽快に戻りますが、現象の再現性は高く、何度でも発生します。

重くなる検索さえなければ、2?3日でも軽快に動作し続けます。またDB管理用にWeb/AP機にphpMyAdminも入れてますが、これはTomcatが重い時でもサクサクです。

現状では、どこが悪いか調べる方法すらわかりません。VisualVMを用意しましたが、値を見てもよくわかりませんでした。。どういう問題が考えられ、どういう調査をすればいいでしょうか。「ここを調べてみて」を教えていたたければ、調べて結果をここに追記します。

よろしくお願いいたします。

※仕様など詳細はコメント欄に書きます。

●質問者: nacookan
●カテゴリ:インターネット ウェブ制作
✍キーワード:AP Apache CentOS dB Java
○ 状態 :終了
└ 回答数 : 8/8件

▽最新の回答へ

1 ● adachi_c
●16ポイント

psコマンドでTomcatプロセスのメモリ使用量を見てください。

軽い検索をやった場合と、思い検索をやったときの違いを見てください。

100万件検索した結果、検索結果をどこかのメモリ領域にいれ、解放し忘れているのではないかと思われます。

で、新しい処理をやろうとして、メモリ不足で、ページングで時間がかかっているのではないでしょうか。

また、100万件の検索をするにしても、SQLでselect * などとするのではなく、カラムを指定する。

検索対象のテーブルをインデックス化する、といったことが必要だと思われます。

◎質問者からの返答

ありがとうございます。

psコマンドで見るメモリ不足というのは、OSのメモリのことかと思います。さらにJavaVMにもメモリを割り当てるわけですが、正直、その適切な値の求め方もわからない状況で、とりあえず多めの2GBをヒープサイズ(-Xmx)に割り当ててる、という感じです、現状は。

いただいた回答へ返信しようと、psコマンドでチェックしてみました。たしかに重い検索のときはメモリ使用量が多くなっています。そして、割り当てたメモリを超えてしまう場合に、重い状況になるようです。

プログラム的には、S2JDBCを使って検索をしています。検索結果は一度に取得せず、iterateの仕組みを使っています。

参考 : http://s2container.seasar.org/2.4/ja/s2jdbc_manager_auto.html#イテレーションによる検索

これを使えば、メモリには常に1件分のデータしかため込まないと信じているのですが、それが違うのでしょうか。。。

また、同様に、カラムを指定するのも、S2JDBCのSQL自動生成を使っていると難しそうです。もちろんselectBySqlを使えば可能かと思いますが、検索処理をほとんど作り直しになってしまうため、最後の手段にしたいです。。。


2 ● あすか
●16ポイント

VisualVMでCPUプロファイルをあたってみて下さい。

おそらくCPU時間を極端に消費しているスレッドがあるはずで、そこに何らかの原因が潜んでいます。

◎質問者からの返答

ありがとうございます。

重い状況が起きているときにVisualVMでやってみるということでしょうか。今度試してみます。

ところで、CPUの話をすると、重い状況のときはCPU的にはまだまだ余裕があります。

8コアなので最大800%なのですが、100%だけ消費している状況です。

これは、複数のCPUに振り分けできないような処理(Javaなのでsyncronizeされてる処理?)が

1つのCPUを限界まで使っていて、他のCPUはそれが終わるまでヒマ、ということでしょうか。

自分のコードにはsyncronizeはどこにも書いてないので、フレームワーク内ですかね。


3 ● pretaroe
●8ポイント

DBの接続あたりを見直してみては?

コネクションプールは使っておられるでしょうか?

あとはTomatのログとか

http://mism.blog13.fc2.com/blog-entry-291.html

◎質問者からの返答

ありがとうございます。

コネクションプールは使っています。10接続だったと思います。

重い状況のときは、show processlistをしても何も出ないことからもわかるように、DBには何の負荷もかかってないようです。

Tomcatのログは、catalina.outのログローテーションは設定しています。

確かにそれでも1ファイルの量は多いですが、重い検索をしたときに全体が重くなって、再起動したら軽くなるという状況の理由としては弱いように感じます。


4 ● a-kuma3
●23ポイント

ぱっと見た感じ、GC で CPU を食いまくってる感じ。

Tomcat のプロセスが CPU を食ってて、物理メモリにも余裕があって、swap はほとんど使ってないのだから、

ページングだとか、java VM 以外のプロセスやスレッドが、どうとか、そんなことは考えなくて良いと思う。


まずは、-verbose:gc を指定するなどして、重たくなったときの GC の挙動を確認した方が良いと思う。

大量検索をしたときの検索結果を、セションに保持しててヒープの空きが無くなってるとか、じゃないかなあ。


後、アプリの作り次第だけど、java の起動パラメータは見直した方が良いと思う。

一番気になるのは、Perm 領域のサイズがでかすぎること。

Action クラス以外に、いくつクラスがあるか知らないけど、デフォルトか、せいぜい 128M もあれば十分。


New領域のサイズ指定も、必要なんかな?

チューニングした結果で決めたサイズじゃないのであれば、指定を無くして、割合は VM に任せるべき。

◎質問者からの返答

ありがとうございます。

考えなくていいところを教えていただくと心強いです。

いただいた情報から、さらに調査をしてみました。確かに、VisualVMで見ていても、重い検索をするとヒープサイズが増えていき、検索が終わる前にヒープサイズの上限(2GB)に達してしまうと、そこでグラフがギザギザになり、全体的に重くなる現象になってしまいます。最大値に達する前に検索が終わった場合は、全体的に重い状況にはならないようです。

これは、上限に達したから頻繁にGCが行われて、少しだけ解放されたメモリをすぐに消費し、またGCをして。。。ということが起きてるのでしょうか。

検索結果をセッションに保持するようなコードは書いていません。ヒープの上限に達する前に検索が無事に終わったケースでは、検索が終わった後にVisualVMからGCを実行させると、ストンとグラフが下まで落ちます。検索処理の実行中や、重い状況になってしまったあとにVisualVMからGCを実行すると、何も変化がありません。

つまり、検索処理でものすごいメモリを消費しているということでしょうか。前の方の回答にも書きましたが、S2JDBCのiterateの仕組みを使っているので、メモリは大量に消費しないはずなのですが。。。その考え方が間違っているのか、コードが悪いんですかね。。。

もうひとつ、Javaの起動パラメータは、正直言ってよくわからないで設定しています。各領域があるのはわかっているのですが、どれくらいの値が適切かもわからないです。やはりなるべくデフォルト値に任せた方がいいのでしょうか。

ヒープは大きくしていいけど、PermやNewはデフォルトに任せた方がおすすめですか?規模にもよるのでしょうが、逆に、PermやNewをデフォルトではない値を指定しなきゃいけないのは、どういうときなのでしょうか。


5 ● あすか
●15ポイント

イテレーションによる検索」にあるようなコーディングをしていればメモリ消費は抑制されますが、検索結果を逐次変数や配列に格納しているとしたら、メモリ効率が悪くなる可能性があります。

ご確認下さい。

◎質問者からの返答

ありがとうございます。

検索結果は、その一部のレコード(画面表示するための先頭のn件)だけはエンティティをリストに保持し、一部のカラム(IDに相当する値)だけは、あとで今の検索結果に対して一括処理をさせるために、全件の分を別途リストに保存しています。ですので、メモリを食うとしたら後者の全件のIDを持っているリストだと思われます。

ですが、これは単純なList<String>で、IDひとつはせいぜい10桁なので、たとえば100万件だとしても、30MBくらいですよね(1文字3バイトx10文字x100万件)。2GBのヒープがいっぱいになるとは考えにくいと思ってます。違いますでしょうか。

ちなみにJavaVM内のメモリの利用割合って何かで調査できるもんなのでしょうか。


1-5件表示/8件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ