abコマンドでの秒間リクエスト

このQ&Aのポイント
  • 自分のサイトをabコマンドを使用して負荷テストしています。リクエスト数が31と、結構ひどいなと思っています。
  • 他のサイトで同様のテストを行った結果、教えてgooトップは秒間25リクエスト、Twitterは秒間13リクエストしか処理できなかった。
  • この考え方が間違っているのかどうか、詳しい方に教えていただきたいです。
回答を見る
  • ベストアンサー

abコマンドでの秒間リクエスト

現在、自分のサイトをabコマンドで負荷テストしています。 ab -c 10 -n 100 http://~/ 10同時接続で、100回リクエストしています。 この結果、 Requests per second: 31.03 [#/sec] (mean) 秒間のリクエスト数が31と、結構ひどいなと思って、他のサイトで試したところ、 ■教えてgooトップ ab -c 10 -n 100 http://oshiete.goo.ne.jp/ Requests per second: 25.08 [#/sec] (mean) 秒間25ということは、100同時アクセスで・・・と考えると非常に遅い気がします。 ■twitter (goo_blog) ab -c 10 -n 100 http://twitter.com/goo_blog Requests per second: 13.75 [#/sec] (mean) twitterが秒間13リクエストしか処理できないとかありえない気がします。 そもそもこの考え方って間違ってますか? 詳しい方、ぜひご教授下さい。 よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

うーん、さっきので通じなかったか…。 まあ、つまりですね。abコマンドの結果の意味を考えて欲しいわけですよ。 "#/sec" として出てくる値の意味は何か、ということを。 これ、単に、リクエスト数を合計時間で割っただけですよね。 ということは、測っているものはサーバの能力ではなくて、あくまで「自分から見たサーバへのアクセス速度」でしかないわけです。 そして、それはRTTや並列数によって大きく影響を受けるわけです。 つまり、この結果は「秒間13リクエストしか捌けない」ではなく、「平均すると秒間13アクセスできた」が正しい。 サーバ自身のリクエスト処理能力を見たいのなら、サーバlocalhostから見なければ性能評価になりませんよ、と。 そういうことを言いたかったのでした。 蛇足になりますが、apacheの並列数は初期状態では意外と少ないので、それを増やさないと十分な性能が出ない可能性があります。

xxyybbaa55
質問者

お礼

すいません理解しました;;;; 回答本当にありがとうございました!!!

その他の回答 (1)

回答No.1

abの実装を知らないので正確なところは言えませんが、RTTの問題は大きいでしょう。 twitterはサーバが海外にあるので、120ms以上のRTTがかかります。HTTP GETを行うためにはTCPハンドシェイクで二往復が必要なので、一回の処理に最低でも250ms程度はかかります。さらに、裏では何らかのプログラムが動いているので、実際はこれよりもさらに遅延します。 これは、たとえば、接続数が10000個あったとしたら、その10000個すべての接続で同じように起こる遅延です。 したがって、並列数を変えればまた違った結果も出るはずです。 ベンチマークによって何をはかりたいかに寄るのですが、CPUやメモリ等のリソースによるApacheの限界をはかりたいのなら、webサーバのlocalhostから大量の並列リクエスト数で実行するのが正しいベンチマーク方法かと思います。でないと、webサーバとの間のRTTが測定上のボトルネックとなってしまいます。 それが無理なら、並列リクエスト数だけでも多くすべきかと。 あと、ベンチマークソフトを外部のサービスに行うことは、攻撃者と見なされても仕方ないことなので、やめた方が良いですよ、と一般的なアドバイスもしておきます。

xxyybbaa55
質問者

補足

回答ありがとうございます。 なるほど勉強になります! 自分が一番気になった部分は、RTTの問題も含め、秒間11リクエストしか捌けないの!?ということです。 twitterも当然負荷分散していると思うんですが、秒間11リクエストしか捌けないなんて、とてもあんな大規模なサービス運営できないと思います。教えてgooもしかりです。yahooやgoogleもおなじです。秒間50も捌けないとabコマンドでは結果として出ます。 この点どう思いますか?? >あと、ベンチマークソフトを外部のサービスに行うことは、攻撃者と見なされても仕方ないことなので、やめた方が良いですよ、と一般的なアドバイスもしておきます。 ごもっともです^^;;;なので一応少な目のリクエストにしてます;

関連するQ&A

  • プログラムが3日目以降から調子が悪くなる

    C言語を用いてある測定装置のデータを5秒おきに取得するプログラムを作成したのですが、3日11時間14分(61,128回目のループ)を過ぎると取得する時間が15秒後に一回になっていました。おそらくループが原因だと思うのですが自分で解決できなくて困っています。 ループの入り口は for(p=1;p<=loop;p++){ でpの型はlong型です。 5秒間に1つずつpの値は増えていくのですが、long型なので大きさは十分だと思います。 5秒間待つループは while((((clock()-start1)/ CLOCKS_PER_SEC ) % TIME )!= 0 ) { } // TIME=5 としてあり、start1には一番最初のループの前で取得した時間データが入っています。

  • グローバル変数を別Cファイルで使用すると暴走

    現在ATMELのATxmega128A1でプログラミングを行っています。ブザーを鳴らす機能で、必ずならしたらすぐに消すというコードを作成したつもりなのですが、ずっとなり続けてしまうという動作が出てしまいます。現在のソースコードで抜けが出ているとか、ソースコードにuCOSというOSプログラムも使用しているために起きているのか原因がつかめていませんが、複数タスクの動作のタイミングで起きているなどを疑っています。 そこで、ブザーを鳴らしたと同時に、5秒間計るタイマグローバル変数を作成して、もし5秒間ブザーを鳴らし続けてしまったとしても、このタイマ数値で検知したらブザーを強制停止できるようにするために u32 BuzzerTimeLimit_GetTime=0; このグローバル変数を作成しました。 ブザーを鳴らしたと同時にBuzzerTimeLimit_GetTime に現在時刻+5秒後の時刻を代入しています。 set_buzzer_drv(true); BuzzerTimeLimit_GetTime = OSTimeGet() + OS_TICKS_PER_SEC * 5; この変数をmenu.cというファイルで宣言しています。 BuzzerTimeLimit_GetTime のグローバル変数は他のCファイルの menu.c Oper.c rf_task.c これらのファイルでも使用しているためextern宣言も必要だなと思ったのですが、menu.hファイルに extern u32 BuzzerTimeLimit_GetTime と記述したところ、コンパイル後にダウンロード後、暴走したような動作をします。 試しにmenu.c以外に記述している BuzzerTimeLimit_GetTime変数のコードを削除すると、正常に動作できます。 なぜこのようなことが起きるのかとか、チェックしたほうがよい箇所や方法など、ご教示頂きますよう、よろしくお願い致します。

  • 素因数分解のプログラムを作成しました。

    素因数分解のプログラムを作成しました。 なぜか11桁を超えた場合、正しく表示されません!! アドバイス等お願いします。 あと、処理時間も組んでみましたがこちらもうまくいきません。 改善をお願いしますm(_ _)m #include<stdio.h> #include<time.h> void fanction(int); void main(void) { int n; clock_t start_time, end_time; printf("整数を入力してください。\n"); scanf("%d",&n); start_time = clock(); fanction(n); end_time = clock(); printf("\n\n処理時間:%.3f秒\n",(double)(end_time - start_time) / CLOCKS_PER_SEC); return 0; } void fanction(int n) { int m; char c='='; for(m=2;n != 1;m++) { while(n%m == 0) { n = n/m; printf("%c%d",c,m); c='*'; } } }

  • Pingコマンドによるリクエスト

    Pingコマンドによるリクエストに対する応答を拒否する方法はないでしょうか? Domainサーバー自体をICMPv6 echo Requestなどでブロックしてしまうと この前の質問でお話ししたようにIPv6の接続性に問題が出てしまうのですが、これをやめてしまうとセキュリティ上問題が出てしまいます。 これをどうにかする方法をどなたかご教示お願いしたいです。 どなた様か知恵をお貸しください。

  • エジプト分数問題:修正文

    式1: P + z = 4y(xz-1) 式2: P + a = (4ab-1)(4c-a-1) Pは 24n+1 (nは自然数) 型の素数であるとする。   式1の導出:L=4xyz-4y-z    M=xz-1 のとき 4/L=1/xyLM +1/xyL +1/yM が成り立ちます。     そして、P=Lとおいて式を変形すれば式1が導かれます。   式2の導出:  4/P =1/(6n+k) +1/H +1/J 4/P-1/(6n+k)=1/H +1/J P=24n+1 とおき、 (4k-1)/(24n+1)(6n+k)=1/H +1/J ここで、HとJを変形して (4k-1)/(24n+1)(6n+k)=(4k-d-1)/Pdm(4k-d-1)                                                      +d/Pdm(4k-d-1)                6n+k=4kdm-dm(d+1) から      k=c、d=a、m=b として4を両辺にかけると         24n=16abc-4c-4ab(a+1)                  =(4ab-1)(4c-aー1)-a-1                24n+1+a=(4ab-1)(4c-a-1)                P+a=(4ab-1)(4c-a-1) となる。       素数Pに対して z を動かして式1の解(x、y、z)      が存在するか確かめる。もし(x、y、z)が存在するなら素数P            は単位分数分解の解が存在する。       もし、式1の解が存在しないのなら、aを動かして式2の解            (a、b、c)が存在するか確かめる。もし存在するなら素数Pは      単位分数の解が存在する。もし、式1と式2の単位分数分解の      解が存在しない場合、そのことを私に教えてほしいのです。        一応素数Pがどれぐらい3つの単位分数の解が存在するか      調べてみたのですが、少なくともPが1000以下の場合には      解がすべて存在することが調べて分かっています。知りたい      のは式1と式2を同時に成り立たせない素数Pがあるかという      ことが知りたいです。もし、すべての素数で反例がないことが      分かったのならエジプト分数の予想は正しいことになります。      ただ、多分反例が見つかると本人は思っています。      P=937 の場合(例1)     z=3、P+3=4y(3x-1)=940=4・5・47        P+3=4・47・(3・2-1)    (x、y、z)=(2,47,3) なので解が存在する。          P=1009 の場合(例2)               a=3、P+3=(12b-1)(4c-4)    1012=4・23・11=4(12b-1)(c-1)    (a、b、c)=(3,2,12)、(3,1,24)    が成り立ち P=1009 も解が存在する。

  • 教えて!gooってOKWaveとけんかして独立?

    http://blog.goo.ne.jp/oshietegoo/e/f6a65a8fb8884c7c7b069b9c2ef9c04b >質問や回答の投稿につきましては、リニューアル以前は、教えて!gooサイト上だけでなく、株式会社オウケイウェイヴの運営するOKWaveパートナーサイト上にも同時に投稿されていましたが、リニューアル後は教えて!gooのみに投稿となります。 大きな変更があるようですが、ユーザーが別々になってしまうので、教えて!gooとOKWave、両方にとって大きな損害になるのではないでしょうか? ちゃんとした答えをつけるひとも、両方でへってしまうということですよね? これまでも、質問回答が質的に低く低俗になっているという指摘が多いのに、自殺行為に近いと思いませんか?

  • 言語はRubyを使っているのですが、現在OAuthを使ってTwitte

    言語はRubyを使っているのですが、現在OAuthを使ってTwitterアプリを作ろうと思っています。 そこでgemのoauth 0.3.6を入れ、色々なページを参考に作ろうと思っているのですが、request_tokenが旨く取得できません。 何故か認証エラーになってしまいます。 以下がコードになります。 ========================= require "oauth" oauth = OAuth::Consumer.new("Key", "SecretKey",{:site => "http://twitter.com"}) oauth.get_request_token(:oauth_callback=>"callback先url") ========================= 上記のコードをirbにて入力した際に出力されるエラー内容はこちらです。 OAuth::Unauthorized: 401 Unauthorized C:/Ruby/lib/ruby/gems/1.8/gems/oauth-0.3.6/lib/oauth/consumer.rb:200:in `token_request' C:/Ruby/lib/ruby/gems/1.8/gems/oauth-0.3.6/lib/oauth/consumer.rb:128:in `get_request_token' ちなみに開発環境は以下です。 Windows XP SP3 Ruby 1.8.6 Ruby on Rails 2.3.5 Mysql 5 もし上記、わかる方がいらっしゃいましたらご教授頂けないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 数学の確率です。わかる人、お助け下さい(泣)

    第一問 (1)さいころを3回投げ、出た目の数を順にa、b、c、として、χの2次方程式abχ2乗-12χ+c=0を作るとき、この2次方程式が重解を持つ確率 (2)3個のさいころを同時に振り、出る目の最大値をM、最小値をmとするとき、M-m=1となる確率 第二問 nを3以上の整数とする。このとき、以下の確率を求めなさい。 (1)さいころをn回投げたとき、出た目の全てが1になる確率 (2)さいころをn回投げたとき、出た目の数が1か2の2種類になる確率 (3)さいころをn回投げたとき、出た目の数が3種類になる確率 第三問 (1)1個のさいころを4回投げるとき、5以上の目が3回以上出る確率 (2)1個のさいころを4回投げるとき、少なくとも1回3の倍数の目が出る確率

  • c言語 プログラム

    c言語の時間計測を調べていたら下記のようなプログラムを見つけました。 プログラムを読んでて疑問があったので質問します。 質問は2つあります for文のところに x = (double)k/loop が入っているのですがどのような意味なのでしょうか? また*1.e6の値はいくらなのでしょうか? サンプルプログラム #include<stdio.h> #include<time.h> #include<math.h> int main(){ clock_t stt,mid,end;//_測定時刻 double secs;//_経過秒数 double msec;//_マイクロ秒 int k,loop=10000000;//_測定増幅ループ double x;//_対象関数の引数 int clksec=CLOCKS_PER_SEC; char *ttl="elapse_for_exp(x)"; int n,m=7;//_観測ループ double sm,ss;//_合計、平方和 double mean;//_平均値 double stdv;//_標準偏差 sm=ss=0; for(n=0;n<m;n++){ stt= clock();//_測定開始 for(k=0;k<loop;k++){ x = (double)k/loop; } mid = clock();//_中間測定 for(k=0;k<loop;k++){ x=(double)k/loop; exp(x);//_時間測定対象の関数 } end=clock();//_測定終了 secs=(double)((end-mid)-(mid-stt))/clksec; msec=secs/loop*1.e6; printf("%s = %fmicrosec.\n",ttl,msec); sm += msec; ss += msec*msec; } printf("合計____%f\n",sm); printf("平方和__%f\n",ss); mean = sm/m; stdv=sqrt(ss/m-mean*mean); printf("平均値___=_%f\n",mean); printf("標準偏差_=_%f\n",stdv); return 0; }

  • それぞれの暗算にかかった時間

    このプログラムは3つの数字の和を暗算させるプログラムです。 プログラムでは、10回の暗算にかかった合計時間を表示させて います。 質問としては「それぞれの回数にかかった時間をそれぞれ 表示させるにはどうすればいいのかか?」です。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int a,b,c,i,n; int num; clock_t start,end; srand(time(NULL)); printf("暗算トレーニング開始!!\n"); start=clock(); for(i=0;i<10;i++) { a=10+rand()%90; b=10+rand()%90; c=10+rand()%90; n=rand()%17; printf("%d%*s+%*s%d%*s+%*s%d:",a,n,"",n,"",b,n,"",n,"",c); do{ scanf("%d",&num); if(num==a+b+c) { break; } printf("\a違います。再入力してください。\n"); }while(1); } end=clock(); printf("%.1f秒かかりました。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }