- PR -

Failed requestsの解消について

1
投稿者投稿内容
しゅうちん
会議室デビュー日: 2005/11/10
投稿数: 11
投稿日時: 2005-11-10 12:34
現在Apache2+Tomcat4(×3)+Postgres7.3でWEBシステムを構築しています。
最近ユーザー数が増えてきた事から、システムからレスポンスが返って来ないという
事象が頻発しています。

これを解消する為にApache Bench(ab)にて負荷テストを実施すると、
ある値を境にFailed requestsの値が急増します。
同時接続数 300 リクエスト数 500 →Failed requests 0
同時接続数 400 リクエスト数 500 →Failed requests 302

このFailed requestsを減らす方法をご教授いただきたく投稿いたしました。

私は以下の2点を試しましたが、どちらも効果はありませんでした。
・対象のシステムのPCをスペックの良いものに置き換える。
・Tomcatをもう一台増やす。


どうもスレッド数とかプロセス数などようなデフォルトパラメータに縛られて
Failed requestsが増えているのではないかと怪しんでいます。

Apacheの設定もデフォルトです。
TomcatのConnector属性は8009用のデフォルト設定を利用しています。
workers2.propertiesもlb関係の記述を追加しただけで特にチューニングはしていません。

チューニングの方向性や着眼点など誤っていたらご指摘ください。

●Apache Benchの結果
# ab -k -c 400 -n 500 -v 1 'http://xxx.xxx.co.jp/test.jsp?PARAM1=VALUE&PARAM2=VALUE'
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.121.2.1 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

Benchmarking xxx.xxx.co.jp (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Finished 500 requests


Server Software: Apache/2.0.45
Server Hostname: xxx.xxx.co.jp
Server Port: 80

Document Path: /test.jsp?PARAM1=VALUE&PARAM2=VALUE
Document Length: 1791 bytes

Concurrency Level: 400
Time taken for tests: 18.58159 seconds
Complete requests: 500
Failed requests: 302        ●<−ここ
(Connect: 0, Length: 302, Exceptions: 0)
Write errors: 0
Keep-Alive requests: 261
Total transferred: 550178 bytes
HTML transferred: 467451 bytes
Requests per second: 27.69 [#/sec] (mean)
Time per request: 14446.527 [ms] (mean)
Time per request: 36.116 [ms] (mean, across all concurrent requests)
Transfer rate: 29.74 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 23 267.4 0 2999
Processing: 6023 12756 4352.9 15023 18050
Waiting: -1131591902651 -2147483648 565909328634.6 3016 15032
Total: 6023 12780 4340.5 15023 18050

Percentage of the requests served within a certain time (ms)
50% 15023
66% 15027
75% 18040
80% 18042
90% 18044
95% 18046
98% 18047
99% 18049
100% 18050 (longest request)


●サーバー構成
・全てのPC
 Xeon 1.7G × 2
 Mem 1G
 RedHatLinux8.0

・WEBサーバー
 Apache 2.0.45
 jk2.0.2

・アプリケーションサーバー×3
 Tomcat4.1.18

・DBサーバー
 Postgresql7.3
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-10 13:57
Tomcat のバックログ(さばき切れてないけれどもとりあえず受け付けるコネクション数)とかスレッド数(同時に処理できる数)をチューニングしてみてはいかがでしょうか。
あと負荷を掛けた際に GC で stop the world が発生してパフォーマンスが低下することもあります。その場合はヒープ領域などをチューニングしましょう。
しゅうちん
会議室デビュー日: 2005/11/10
投稿数: 11
投稿日時: 2005-11-10 15:14
インギさん
回答ありがとうございます。

>Tomcat のバックログ(さばき切れてないけれどもとりあえず受け付けるコネクション数)とかスレッド数(同時に処理できる数)をチューニングしてみてはいかがでしょうか。

スレッド数は<Connector>のmaxThreadで設定できる事は分かりましたが、
バックログのチューニングはどのように行えるのでしょうか?

また、3台のTomcatで負荷分散をしているとしたら、ApacheのMaxClientを300とし、各TomcatのmaxThreadを100とすればよいという考えで間違いは無いでしょうか?

質問ばかりですいません。。

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-10 16:33
ご期待に添えず残念ですがバックログのチューニング方法については残念ながら存じません。
どなたかご存じの方が回答してくれるのをまつか、ドキュメントを参照するか、Googleで調べるか、ソースコードを追ってください。
ソースを追う場合は ServerSocket のコンストラクタか bind してるあたりを確認すれば良いかと存じます。
http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket(int,%20int)
http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#bind(java.net.SocketAddress,%20int)

スレッド数については必ずしも増やせばよいというわけではありません。同時に実行できるスレッド数が増えても CPU の数は固定です。スレッドを切り替えるためのコンテキストスイッチと呼ばれる負荷が増えて逆にパフォーマンスが低下することがあります。自動的に最適なスレッド数をチューニングするような機能がないのであれば色々と試しておいしいところを見つける必要があります。
CPU一つならだいたい20〜50位の間においしいところがあることが多いようです。

ヒープサイズも同様です。かならずしもヒープサイズを増やせば良いというものではありません。多すぎると GC の負荷でパフォーマンスを低下させるからです。
しゅうちん
会議室デビュー日: 2005/11/10
投稿数: 11
投稿日時: 2005-11-11 12:00
色々試していますが、いまだ改善されません。
Apache2.0.45はperchildかworkerモードで作成し、スレッドを有効にしなければいけませんか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-11 14:02
Apache の設定でとまどうようでしたらまずは Tomcat 単体で最高のスループットを出せる設定を見つけましょう。
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2005-11-11 19:28
引用:
しゅうちんさんの書き込み (2005-11-10 15:14) より:

スレッド数は<Connector>のmaxThreadで設定できる事は分かりましたが、
バックログのチューニングはどのように行えるのでしょうか?



acceptCount です。
しゅうちん
会議室デビュー日: 2005/11/10
投稿数: 11
投稿日時: 2005-11-12 16:11
ありがとうございます。

<Connector>はacceptCountでしたね。
実際、その値をいじっていたのですが、私自身どこからmaxThreadが出てきたのかわかってないです。すいません。

連携などはとりあえず後回しにして、JAVA_OPTSとacceptをいろいろ修正してやってみます。
1

スキルアップ/キャリアアップ(JOB@IT)