- - PR -
急にレスポンスが遅くなる
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-03-23 16:28
「Windows2000 JDK1.4 + Tomcat4.0 + Access2000」の構成のイントラネットですが、
Tomcatを起動して最初は良いのですが、暫く使用していくと、急にレスポンスが遅くなってきます。 通常は数秒で返ってくる検索結果が数十分かかったりします。コンソールにエラーメッセージ等は 表示されていません。ただ単に物凄く遅くなります。この時タスクマネージャのCPU使用状況は問題ないです。 仕方ないのでTomcatを再起動するとサクサク動きます。 遅くなった時にTomcatのサンプルにアクセスしてみると、こちらは直ぐに結果が返ってきます。 コネクションはstaticにしてあります。どんな事が考えられるでしょうか? よろしくお願いします。 | ||||||||||||
|
投稿日時: 2004-03-23 16:44
隣で見ている訳でないので何ともわかりませんが。
一般的な原因としては ・AP サーバが遅くなる メモリリークや他の原因でヒープを食いつぶしてパフォーマンスが低下する。 初期ヒープサイズや最大ヒープサイズを大きくしてみると改善することがある。 (Tomcat サンプルページのアクセスが早いことを考えると、Tomcat から呼ばれるサーバアプリが原因かも) ・DB が遅くなる Access 2000 はさっぱりわかりませんが、Oracle で自前のテーブルスペースを用意せずに System を使ってサボったりすると(酷)、パフォーマンスが落ちることはあります。 (あまりにひどい例ですが、コンフィギュレーションが適切でないとどんな DB でも性能問題は発生します。) のいずれかだとは思いますが、AP サーバと DB サーバが別マシンか同一マシンか、個々のサーバの性能、ネットワーク速度、同時アクセスユーザ数等々を考えて問題を切り分けないと個別の場合の答は出ません。 注: これらの情報を書き込んでもタローさんのところの状況が完全にわかるわけではありません。 ご自身で問題を切り分けて分析してください。分析がきちんとできれば、対応策も見えてくると思います。 [ メッセージ編集済み 編集者: Gio 編集日時 2004-03-23 16:59 ] | ||||||||||||
|
投稿日時: 2004-03-23 16:49
ResultSetやStatementをcloseしていない ……といったところではないでしょうか。とりあえずきっちりとcloseしてみてください。また、Connectionをstaticに持つのはあまりお勧めしないです。 多分、動作が遅くなっても根性でしばらく叩いていれば、例外吐いて倒れると思います。 | ||||||||||||
|
投稿日時: 2004-03-23 16:53
Gioさんと同意見ですが、ボトルネックになっている部分を
探さなければいつまでたっても解決できませんし、 答える側も答えようがないかと思います。 ちなみに上記環境でボトルネック部分を検証するなら、 1・サーブレットクラスのdoXXXが呼ばれた直後 2・DBアクセス前 3・DBアクセス後 4・サーブレットクラスのdoXXX終了直前 の4箇所で System.out.println(new Date()); とかやれば、時間がわかると思います。 で、例えば3と4でとても時間がかかる場合、 3と4の間で怪しい部分に同様な処理を追加して何度も実行してみてください。 このようにボトルネックを探してみて、問題の切り分けをしてみてはいかがですか? | ||||||||||||
|
投稿日時: 2004-03-23 17:04
ん〜単純にAccessの性能の限界のような気がしますが。
クライアントは何台接続していますか? Accessは同時接続5台までじゃなかったでしたっけ? | ||||||||||||
|
投稿日時: 2004-03-23 18:24
コネクションを static にもっているというのは、1本のコネクションを複数のスレッドで使い回しているということでしょうか?
だとすると実際にコネクションの使用中に他のスレッドが待たされてしまいますので性能がスケーラブルに向上しないはずです。 スレッドの数と同等にコネクションをプールするようにしましょう。 また、負荷をかけながらスレッドダンプをとればどこにボトルネックがあるかわかりますよ。 | ||||||||||||
|
投稿日時: 2004-03-23 18:28
皆さんありがとうございます。
先ずは問題の切り分けからして行こうと思います。 ところで、私が勘違いしているかも知れませんが、 たーぞうさんの仰っているAccessの同時接続数についてですが、 今回のような構成で接続数に問題があるのでしょうか? つまり、直接Accessに接続しているのはTomcatなので、Accessからしてみれば、 Tomcatとのみ接続しているという事にはならないのでしょうか? (外していたらすみません) それと補足ですが、TomcatもAccessも同じPCです。 | ||||||||||||
|
投稿日時: 2004-03-23 20:41
unibon です。こんにちわ。
複数の接続間で、たとえば接続Aが接続Bにブロックされているのかもしれません。 上記の「数十分」というのはタイムアウトで接続Aが接続Bをブロックしなくなる時間かもしれません。もし遅くなるのが5分単位とか10分単位のようにきっちりした時間だとその可能性が高いです。
static というのは、接続(Connection)をひとつだけ作って使う、という意図でしょうか。接続が思わず複数できてしまっているということはあるでしょうか。 あるいは、ひとつの接続をマルチスレッドで同時に使ったりすると、おそらくうまく動かないと思います。マルチスレッドで使うときは、接続もスレッドごとに別にしたほうが良いです。 そもそも、Access(Jet)ならば、スレッドとごに複数の接続を使うよりは、スレッドごとに排他処理をしてひとつの接続を使うほうが良いかもしれません。Java なら synchronized を使うのが手軽でしょう。
Tomcat のみと接続していることにはなります。ただし、接続数は複数作ることができます。 なおたとえ Access(Jet) であっても、無理をせずに適材適所として使うぶんにはかなり使えるとは思っています。「無理」とは、ローカルディスクではなくリモートのディスクを使ったり、トランザクションを長くしたり、などです。 | ||||||||||||
