« フィードメーターの改修点まとめ | メイン | 体育の日のアイコン »

2005年09月30日


apacheのKeepAliveTimeoutを変更してパフォーマンスが劇的にアップ

サービスをいろいろと運営しているので、サーバーの管理などにはそれなりのノウハウを持っている(つもり)だったのですのですが、最近いろいろと作業を怠っていたらサーバーの負荷が結構高い状態になっていました。

こんな感じ。


11:12:15 up 245 days, 22:52, 1 user, load average: 2.71, 2.54, 2.54
1005 processes: 1002 sleeping, 3 running, 0 zombie, 0 stopped
CPU0 states: 97.0% user 1.0% system 0.0% nice 0.0% iowait 0.1% idle
CPU1 states: 94.0% user 5.0% system 0.0% nice 0.0% iowait 0.1% idle
Mem: 1029724k av, 1020676k used, 9048k free, 0k shrd, 79764k buff
746444k actv, 20k in_d, 21644k in_c
Swap: 2096472k av, 1048464k used, 1048008k free 164904k cache

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
25928 root 15 0 1036 232 212 S 99.9 0.0 2839m 1 libhttpd.ep


vmstat などを見るまでもなく、プロセス数が多くてスワップを食いつぶしているのがわかります。

対処方法としては

 - メモリを増やす
 - プロセスを減らす

のどちらかになるわけです(プロセスサイズはダイエットしているのでこれ以上は小さくならない…)。
#もとはといえば、MaxClients の値が大きすぎ、、なわけですが・・・ ^^;

で、こちらで運営しているサービスの特徴を考えると、どれも「ショートトランザクション」。
つまり、1クライアントからの1アクセスで複数回のリクエストがほとんど発生しない、というものです。

となると、apache の設定で KeepAliveTimeout を調整してみようということになります。


さて、せっかくなので、ここからもう少し理論的(?)に落としてみます (ついてきてください ^^;)。


現在サーバーの KeepAliveTimeout は 15秒です。

で、立ち上がっているプロセス数 1000 個のほとんどは apache プロセスだと仮定すると、現在サーバーはあっぷあっぷなので、平均してサーバーは1つのリクエストを処理するのに

15
-------- = 0.015 sec
1000

かかっているということになります。

で、このサーバーは一日 300万 (!) のリクエストがあるので、お客さんは平均して

60*60*24
---------- = 0.030 sec
300万

秒おきに到着することになります。


すると、単純な待ち行列理論から、サーバーの利用率ρは

 ρ = 平均サービス時間 / 平均到着間隔 = 0.015 / 0.030 = 0.5

となります。

すると待ち行列の長さは、ρ/(1-ρ) = 1 となり、これは「いつこのサーバーにいっても、たいてい1人待ってる」状態となります。まさにあっぷあっぷ。
(ロードアベレージ上ではもう少し大きい値(2.7)になっていますが、これは実行中のジョブも含んでいる(CPU2つあるので、2を引きます)ので「たいてい 2.7 - 2(実行中) = 0.7 人待ってる」状態ということを意味しています。日中の閑散時間帯であることを考慮すると、概ね計算が合います)。

が、これはランダムに人が到着する場合ですので、夜11時にアクセスが集中するような サービス の場合、正直この「利用率 0.5」というのはかなり危険ゾーンだったりします。
アクセスが集中して、予想の倍の来客があれば 到着間隔 = 処理時間 となり、待ち行列は増える一方、サーバーは完全にダウン、となるからです。

Load Average でいえば CPU 数 x 1.5 を慢性的に超えるようになったら赤信号ということですね。


ということで、KeepAliveTimeout を見直して、「10」に変更してみます(本当はもっと小さくてもいいのですが、とりあえず無駄なプロセスが減ればいいので、ここは少しづつ変更していきます。)


すると、こんな感じになりました。


12:06:15 up 245 days, 23:46, 1 user, load average: 0.31, 0.25, 0.61
352 processes: 350 sleeping, 2 running, 0 zombie, 0 stopped
CPU0 states: 14.0% user 1.0% system 0.0% nice 0.0% iowait 83.0% idle
CPU1 states: 5.0% user 0.1% system 0.0% nice 0.0% iowait 93.0% idle
Mem: 1029724k av, 717156k used, 312568k free, 0k shrd, 89340k buff
468244k actv, 25960k in_d, 14452k in_c
Swap: 2096472k av, 89192k used, 2007280k free 188448k cache

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16483 root 16 0 2104 1348 1276 S 22.0 0.1 9:58 0 libhttpd.ep

劇的に改善!です。

計算上はサーバーの処理時間が 2/3 になるので、待ち行列の長さは半分の 0.5 になります。
が、実際には、サーバー処理時間が短くなったことにより、待ち行列が伸びる可能性が劇的に削減され、結果的にプロセス数が半分以下におち、swap もほとんど消費することがなくなるという好循環がおこったようで、パフォーマンスが相当改善されたというわけです。


もちろん、他にもいろいろと複合要因があるとは思うのですが、パラメータ一つでこれだけ改善されたことにちょっとびっくり。


みなさんも サーバーの増強を考えるまえに、チューニングの見直しも検討してみてはいかがでしょうか。


●参考
 @IT: httpd.confによるWebサーバの最適化


管理人の運営サービス:

メッセンジャー -- 会議室型メッセンジャー : フレッシュミーティング

RSS配信サイト -- あらゆるサイトのRSSを配信:My RSS.jp

ブログSEO対策 -- ブログ専用。検索エンジンのアクセス解析に:トラックワード

RSSリーダー -- リーダーだけの快速RSSリーダー:フレッシュリーダー

人気ブログランキング -- ブログの更新頻度と人気 度を測定:フィードメーター

リンク元アクセス解析 -- リンクが張られた瞬間にRSSで通知するアクセス解析:トラックフィード

ブログRSS検索 -- 旬な情報をお届けします:フレッシュフィード

RSS配信・作成 -- オンラインでRSSを作成・配信・分析できるサービス:RSSフィード.cc

RSSリンク集 -- RSSの簡単リンク集:RSSリンク集

ブックマーク -- メールでブックマークを実現:あとで読む

bookmark -- an email based bookmark service:toread.cc

RSSとは -- RSSに関する情報が満載のサイトです

投稿者 aka : 日時 2005年09月30日 16:32

トラックバック

このエントリーのトラックバックURL:
http://210.188.206.194/mt-tb-sf.cgi/235

このリストは、次のエントリーを参照しています: apacheのKeepAliveTimeoutを変更してパフォーマンスが劇的にアップ:

» [Web] 重いですね from ざ・わーるど@はてな
サーバーがクソ重いので困っています。 loadaverageが平均で2〜6を言ったりきたり。 topをみていると、Apacheが20%くらいCPUリソースをくっ... [続きを読む]

トラックバック時刻: 2006年02月21日 00:36

» ささま/Apache2ネタ from PukiWiki/TrackBack 0.1
概要 適当にネタをひろっては書こうかな。 ↑ ネタ http://www.drk7.jp/MT/archives/000772.ht... [続きを読む]

トラックバック時刻: 2006年03月30日 10:59