- - PR -
Failed requestsの解消について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 | ||||
|
投稿日時: 2005-11-10 13:57
Tomcat のバックログ(さばき切れてないけれどもとりあえず受け付けるコネクション数)とかスレッド数(同時に処理できる数)をチューニングしてみてはいかがでしょうか。
あと負荷を掛けた際に GC で stop the world が発生してパフォーマンスが低下することもあります。その場合はヒープ領域などをチューニングしましょう。 | ||||
|
投稿日時: 2005-11-10 15:14
インギさん
回答ありがとうございます。 >Tomcat のバックログ(さばき切れてないけれどもとりあえず受け付けるコネクション数)とかスレッド数(同時に処理できる数)をチューニングしてみてはいかがでしょうか。 スレッド数は<Connector>のmaxThreadで設定できる事は分かりましたが、 バックログのチューニングはどのように行えるのでしょうか? また、3台のTomcatで負荷分散をしているとしたら、ApacheのMaxClientを300とし、各TomcatのmaxThreadを100とすればよいという考えで間違いは無いでしょうか? 質問ばかりですいません。。 | ||||
|
投稿日時: 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-11 12:00
色々試していますが、いまだ改善されません。
Apache2.0.45はperchildかworkerモードで作成し、スレッドを有効にしなければいけませんか? | ||||
|
投稿日時: 2005-11-11 14:02
Apache の設定でとまどうようでしたらまずは Tomcat 単体で最高のスループットを出せる設定を見つけましょう。
| ||||
|
投稿日時: 2005-11-11 19:28
acceptCount です。 | ||||
|
投稿日時: 2005-11-12 16:11
ありがとうございます。
<Connector>はacceptCountでしたね。 実際、その値をいじっていたのですが、私自身どこからmaxThreadが出てきたのかわかってないです。すいません。 連携などはとりあえず後回しにして、JAVA_OPTSとacceptをいろいろ修正してやってみます。 |
1