
現在、JMeterを使用してTomcat上で動作するAPに負荷を掛けた際のパフォーマンスを測定しております。
負荷を掛けずにブラウザで処理を実行した際には1秒程度でレスポンスが返却されてくるのですが、
以下の条件で負荷を掛けるとレスポンス速度が段々と遅く(8秒~500秒程度)なって行ってしまいます。
また、かなりの頻度でConnectionタイムアウトが返却されてしまいます。
[負荷条件]
スレッド数:1000
Ramp-Up期間:60秒
ループ回数 :無限ループ
※ スレッド数を500くらいにするとConnectionタイムアウトは発生しないのですが、
処理時間はやはりかなり遅くなってしまいます。
最初はJVMのFullGCの頻発が原因かと思い、GCの状況を確認しましたが、
パフォーマンスに影響を与えそうなFullGCは特に発生していませんでした。
[JVM オプション]
"-server -Xmx1024m -Xms1024m -XX:MaxPermSize=128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseTLAB -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10 -XX:MaxTenuringThreshold=0 -XX:SurvivorRatio=256 -XX:+PrintGCDetails -Xloggc:/usr/local/tomcat/logs/gc.txt"
次にTomcatのserver.xmlでの最大thread数がデフォルトの状態だったので、
maxthreadsの値をとりあえず「2000」まで増やしてみたのですが状況は変わらずでした。
[server.xml]
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8123" maxHttpHeaderSize="8192" minProcessors="5" maxProcessors="1000"
maxThreads="2000" minSpareThreads="25" maxSpareThreads="1000"
enableLookups="false" acceptCount="100" debug="0" connectionTimeout="60000"
useURIValidationHack="false" disableUploadTimeout="false" />
また、topを確認してもロードアベレージが高くなっているのが少し気になりますが(5.0~7.0程度を推移)、
Swap領域等は使用されている訳でもありませんでした。
Tomcatの経験もほとんど無いため何がボトルネックとなっているのかが分からずに困っております。
皆さまの経験から、推奨される設定、どこを調査した方が良いか、または参考となるサイト等が御座いましたらご教授願えないでしょうか。
[環境]
CentOS release 4.7
メモリ:4G
CPU :Intel(R) Xeon(R) CPU 2.00GHz X 2
jdk1.5.0_14
Tomcat 5.5
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
とりあえずthread数について。
Tomcatのthread数は簡単に言えば瞬間的に同時に処理する数です。
これはレスポンスを返し終わった直後に使いまわし可能になります。
JMeterのスレッド数が1000ならば最大でも1000アクセスしかないわけで
それ以上を設定しても無意味です。
通常なら同時アクセスユーザ数の1/10もあれば十分です。
コネクションプーリングの数もボトルネックになりやすいのですが
CPUが100近いのであれば今回は関係ないでしょう。
定数スループットタイマで1分当たりに1000リクエストに設定し
かつ1000スレッドだと1分当たり100万リクエストを発行しようと
していることになります。凶悪すぎます。単純に負荷をかけすぎです。
DoS攻撃耐久テストなどでなければやめたほうがいいでしょう。
JMeterを使ってテストをするときの一般的(だと思う)な方法を書いておきます。
1)一般的な操作のシナリオを1人分作ります。このときありそうな操作・遷移
を考えることが重要です。で、各画面間の遷移の間にガウス定数タイマなどを使って
現実的な待ち時間を設定します。
例:ログイン画面を表示→ログイン→初期画面表示→検索(各画面間の平均待ち時間3秒)
2)スレッド数を100、200、400…などと増やしてテストをする。
これだけです。
こうすることによってターゲットとする人数が同時間帯にアクセスした場合の
一般的な負荷をかけることが可能になります。
結論を言うと設定・チューニング云々の前にテスト方法に問題がある可能性のほうが高いのではと思いました。
mibusysさん
回答ありがとうございます。
ご指摘頂いた通り、今回のテストではスレッド数が1000件なので2000は必要ないですね。。。
目標値が1分当たりに2000件を捌く事だったので一応2000を設定してしまっておりました。
定数スループットタイマに設定する値は1スレッド当りの値だったのですね(>_<;)
1分当たりの総リクエスト数になるものだとばかり思ってしまっていました、すみません勉強不足ですね。
JMeterの一般的な試験の仕方につきましてもご教授ありがとうございます。ただ、今回のAPでは画面遷移等は無く、様々な検索条件に合わせて結果を返すAPのため、複雑なシナリオは特にございませんでした。
別の機会で再度JMeterを使用する際にはぜひぜひ参考にさせて頂きます。
もっとテスト方法を見直さないといけないですね。
ご指摘頂いた内容を受けて再度試験を実施したいと思います。
No.5
- 回答日時:
うちの会社では、
Yourkit Java Profiler
という製品を購入して、プロファイリングを行って、
チューニングしました。
私は直接使っていませんが、使ったメンバーによると、
使いやすかったそうです。
参考URL:http://www.yourkit.com/
yujiさん
回答ありがとうございます。
プロファイラはNetBeansを使おうと思っていたのですが、
Yourkitも使い易いのですね。
参考URL等からぜひ検討させて頂きたいと思います。
情報ありがとうございました。
No.4
- 回答日時:
> サーバ側のチューニング
案外コードに無駄が多いと言う可能性も
メモリだけじゃなくCPU負荷も確認してね。
メモリに余裕あるかもしれないけど
CPUに余裕がないのかもしれないわ。
あとデータ転送量も要注意ね。
途中のルータやケーブルもボトルネックになりうるわ。
askaaskaさん
回答ありがとうございます。
ご指摘頂いた点を踏まえて、Linux自身から負荷を掛けてみましたが
やはり処理速度は遅くなって行ってしまったのでネットワーク関係ではなさそうな気がします。
また、負荷を掛けている際のスレッドダンプ等も取得してみましたがブロックされていそうな箇所は無さそうでした。
ただ、CPU使用率が95%くらいと高くなっているのとロードアベレージが高い事からコードに無駄があるのか、
検索処理のファイルIOの辺りで遅延が発生しているのかもしれません。
もう少し調べてみます。
もし理由が分かりましたらまた書き込ませて頂きます。
色々とご指摘ありがとうございました、色々と勉強になりましたっ!
No.3
- 回答日時:
> Response message: Non HTTP response message: Connection timed out: connect
これはね
JMeterが想定している時間内に
レスポンスが得られないときに発生するのよ。
> スレッド数:1000
> Ramp-Up期間:60秒
> ループ回数 :無限ループ
単純に処理しきれないのね。
TomcatじゃなくてJMeterの方よ。
askaaskaさん
回答ありがとうございます。
JMeter側で判断しているタイムアウトだったのですね。勉強不足で申し訳ございませんでした。
ただ、JMeterの負荷を下げた場合(例:スレッド500、繰り返し1回)には
> Response message: Non HTTP response message: Connection timed out: connect
の応答は返って来ないのですが、処理速度はかなり劣化(20秒~60秒)してしまいます。
こちらは何かしらサーバ側のチューニングで回避出来ないかと考えております。
何かしら注意する点や、参考となるサイト等をご存知でしたらご教授頂ければ幸いです。
No.2
- 回答日時:
ぱっと見た感じではTomcat云々の前にJMeterのシナリオが怪しい気がします。
タイマに何を使っていますか?
タイマの待ち時間をどの程度にしていますか?
もしかしたらタイマの待ち時間が小さすぎることが原因かもしれません。
何のタイマも使っていないのだとしたらそれが間違いなく原因です。
普通の運用を想定した負荷検証ならガウス定数タイマなどを使って
適切に待ち時間を設定しましょう。
万が一それが原因ならまずはもう少しJMetertを勉強されたほうがいいと思います。
mibusysさん
回答ありがとうございます。
タイマには「定数スループットタイマ」を使っています。
1分当たりに1000リクエストを想定して設定しておりました。
ご指摘頂いた通り、JMeterにつきましても勉強中でして理解が乏しいと思います。
上記の1分間当たりに1000リクエストは高い値を設定しすぎてしまっているのでしょうか。
No.1
- 回答日時:
1)
どんなアプリケーションなのか判らないわ。
2)
Connectionタイムアウトって何のConnection?
最低でもこの2つが判らないと話が進まないわ。
askaaskaさん
回答ありがとうございます。
説明不足ですみませんでした。
1)どんなアプリケーションなのか判らないわ。
クライアントから送られてくる検索キーワードを含むXMLファイルを検索し、そのXMLファイルの内容をクライアントへ返却するアプリケーションです。
DB等は使用しておらず、Tomcatのコネクションプール等も使用しておりません。
2)Connectionタイムアウトって何のConnection?
JMeterのアサーションの結果に「Response message: Non HTTP response message: Connection timed out: connect」と言うメッセージが返却されて来てしまいます。
このメッセージを見てTomcatからConnectionタイムアウト(maxThreadsやacceptCount等の設定値によってTomcatへ接続が出来ない?)が返却されて来たものだと思っていました。
上記の内容から何かしら確認した方が良いポイント等が分かりましたらご教授頂ければ幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 日本語 「徒歩圏内」「徒歩圏」の違い。ニュアンスも含め知りたい 5 2022/06/19 10:05
- その他(Microsoft Office) パワークエリの複数ファイルのデータ統合について 3 2022/07/14 17:06
- Yahoo!メール yahooメールアドレスはプロパイダ変更後も使えますか? 1 2022/07/05 20:53
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- 英語 英語の原級の文法で 1 2022/11/05 21:12
- 宇宙科学・天文学・天気 ビッグバンの場所。 9 2022/07/18 13:18
- その他(法律) 肩書きを偽ってメールを送った場合、不正アクセス禁止法違反になるのか? 1 2023/02/18 08:35
- Yahoo!メール yahooメール使用できなくなった。 1 2022/07/05 11:45
- その他(住宅・住まい) 冬の札幌の暖房器具 4 2022/10/18 07:22
- Excel(エクセル) Excelで一つのセルを2行で表示 4 2022/07/01 22:07
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Tomcatのスレッドを破棄する方法
-
どうして、長いURLは途中でカッ...
-
Javaプログラムから外部コマン...
-
do - while文
-
MediaPlayerコントロールのイベ...
-
データ未入力時のエラー処理が...
-
GASで、起動時間の最大値を超え...
-
JavaScriptで・・・
-
処理時間測定について質問があ...
-
jQueryでdiv作成後まで待ってか...
-
スレッド1とスレッド2を交互に...
-
wait()したスレッドが起こされ...
-
Tomcat高負荷時の設定について
-
Windowsサービスの処理
-
表示待ち時間に「処理中...」の...
-
JSP、サーブレットの初期処理
-
doGetとdoPostの違い
-
重たい処理のタイムアウト強制終了
-
マルチスレッド処理でOutOfMemory
-
[Java] while(true)の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
Tomcat高負荷時の設定について
-
Javaプログラムからポップアッ...
-
Javaでのデバッグコード削除
-
アコーディオンメニューをアン...
-
C#で別スレッドの終了を知りたい
-
onBlurとonFocusの処理順序につ...
-
Javaアプリケーション実行の返...
-
JavaScriptからJAVAクラスを呼...
-
表示待ち時間に「処理中...」の...
-
ExcelVBA で文字列の特定の文字...
-
C#の処理をリアルタイムに表示...
-
ラジオボタンの選択判定
-
Javaの再帰でメソッド呼び出す...
-
数値の定数を付ける時
-
[Java] while(true)の意味
-
Javaプログラムから外部コマン...
-
WaitForSingleObjectの復帰時間
-
Tomcatのスレッドを破棄する方法
-
重い処理中のアニメーションgif...
おすすめ情報