画像配信サーバを運用していますが、アクセス数急増により、表示が遅いというクレームが入って困っています。。最適なApacheのpreforkの設定など負荷を下げることができる対策方法を教えて下さい。


[サーバー状況]
access_logの行数ベースで平均160req(行)/sec
一日1000万req(行)
画像平均サイズは1kbyte

[スペック]
CPU Sempron 2600+
メモリ 512MB
HDD 40GB
サーバー1台

[状態]
KeepAlive Off
StartServers 10
MinSpareServers 40
MaxSpareServers 100
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 400000

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 17424 186376 9252 172728 0 0 0 0 2440 2052 8 4 87 0
0 0 17424 189320 9268 172840 0 0 0 224 2381 2048 8 5 87 0
0 0 17424 189592 9268 172956 0 0 0 0 2432 2117 9 5 85 0
0 0 17424 190104 9268 173068 0 0 0 2 2418 2106 8 5 88 0

秒間150reqを超えるあたりから、重くなってきました。Apacheのチューニングでもう少しがんばれるか?サーバー増設をすべきか?その場合はmod_proxy_balancerサーバー1台+apache2台構成で大丈夫か?の2点を特に教えて頂きたいです。

回答の条件
  • 1人5回まで
  • 登録:2008/03/19 01:43:32
  • 終了:2008/03/20 17:37:15

回答(5件)

id:pmakino No.1

まきのっぴ回答回数352ベストアンサー獲得回数282008/03/19 02:38:20

ポイント1pt

小さいファイルを大量にアクセスさせるサーバのようですが、でしたらまず KeepAlive を On にしてみてはいかがでしょうか。

なお、併せて KeepAliveTimeout を少なめに変更した方が良いでしょう。(参考 http://q.hatena.ne.jp/1160252130)

また、それと同時に ServerLimit と MaxClients も増やした方が良さそうです。

可能であれば、prefork から worker に変更できればより良いと思いますが。


メモリも CPU もまだ余裕があるようですし、サーバを増やさなくてもチューニング次第で当面いけるのではないでしょうか。

id:redhat

まずはサーバー設定を調整して、サーバー複数化を検討します。ありがとうございます。

2008/03/19 18:55:40
id:y-kawaz No.2

y-kawaz回答回数1419ベストアンサー獲得回数2252008/03/19 11:34:04

ポイント35pt

・KeepAliveはOnにした方が良いですね。

・mpmにpreforkを使ってるのには理由(PHPが必要等)があるんでしょうか?preforkは1リクエスト(KeepAlive Onなら正確には1接続)毎に1プロセス起動するのでオーバーヘッドが大きいです。可能ならworkerを使った方がよいと思います。workerだとスレッドを使って1プロセスで複数リクエストを処理することができるので、preforkに比べてかなり負荷が減ります。Redhat系ディストリビューションでしたら、httpd コマンドの隣に httpd.worker というプログラムがあると思うのでこれを代わりに使うだけで切り替えられます。一応どうしてもPHPが必要なケースでもPHPもマルチスレッド対応でコンパイルし直せばworkerでも使えます。

・同URLで内容が変わらないコンテンツに関しては、mod_expiresなどを使って適切にキャッシュを利用することでかなり無駄なリクエストを減らすことができます。これを設定をするとブラウザは期間内に同じURLに対してリクエストを投げることすらせずにローカルのキャッシュを使うようになります。

・httpd-2.2が使えるのでしたら mod_cache を利用するのも効果が高いと思います。プログラムで出力しているページでかつパラメータ込のURL毎にレスポンスするコンテンツ内容が変わらないようであれば、プログラムの処理結果をサーバ側でキャッシュ出来るのでリクエスト毎に毎回プログラムが走ることをなくせます。動的・静的に関係なく良くアクセスされるコンテンツに関しては mod_mem_cache を使うことでディスクIOの抑制すらも可能です。

・MaxClientsやMaxRequestsPerChildはサーバのスペック(メモリ量・CPUパワー・CPUコア数など)やサイトのコンテンツの性質(ファイルサイズの大小、動的か静的か等)によって最適な値がかなり変わってくるので運用しながら調整してベストな値を探すのが良いと思います。

・mod_proxy_balancerは背後のコンテンツ生成が比較的重たい場合には効果的だと思います。ですが静的コンテンツがメインの場合は余計なプロキシが1段挟まることになるのでケースバイケースだと思います。

・ロードバランサーやDNSラウンドロビンなどいくつかのサーバの多重化手法がありますが、もしそれらを使う場合は ETag None の設定をしておいて下さい。ETagはブラウザのキャッシュにかかわるヘッダですが、複数サーバで負荷分散をする場合は逆にこのヘッダが原因でキャッシュが効かなくなくなるということが起こりますので。


良くやることで、ざっと思いつくのはこんなところでしょうか。

上記の手法はそれぞれ効いてくる場所が異なるので適切に組み合わせて利用するのがベストです。

逆に頻繁に内容が変わるページでキャッシュ系を不適切に利用するとページが更新されなくなってしまうなど、設定が問題になることもあるので気を付けてください。

id:redhat

非常に詳細な回答ありがとうございます。大変助かります。

workerについては、おっしゃるとおり、画像配信サービスのサービスサイトや登録インターフェースにPHPを使っており、preforkを泣く泣く使っているという感じです。

頂いた情報を1つ1つ試していきたいと思います。

2008/03/19 18:55:14
id:b-wind No.3

b-wind回答回数3344ベストアンサー獲得回数4402008/03/19 13:50:03

ポイント34pt

提示されているデータだけだとなかなか判断はつかないですが、とりあえずスペック不足というわけではなさそう。

どちらかというと回線帯域やコネクション数の方に問題がありそうです。


回線についてはルーター等を見た方が良いけれど、コネクション数についてはある程度調べられます。

netstat - ホストのネットワーク統計や状態を確認する

netstat -n | grep ':80'
||
とすれば 80 番ポートのコネクションの数が出てきます。
これが MaxClients の値に近いようならサーバーの設定に引っ掛かっている可能性があるので増やした方がよいでしょう。
[http://www.atmarkit.co.jp/flinux/rensai/apache2_03/apache03b.html:title]
id:redhat

netstat -n | grep ':80'| wc

11736 70416 1044504

10000本もコネクションが・・・。

クライアント数は少なすぎるようです。ありがとうございます。

2008/03/19 18:53:44
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402008/03/19 20:36:41

ポイント20pt

10000本もコネクションが・・・。

それ全部が有効ということはないと思うので、状態をよく見ましょう。

終了待ちのものは問題ないのでのぞいてしまえばいいです。

Manpage of NETSTAT


preforkを泣く泣く使っているという感じです。

リバースプロキシ Pound を導入しました。 : NDO::Weblog

リバースプロキシを使ってはどうですか?

例は mod_perl の場合ですが、話は mod_php でも同じです。

フロントにリバースプロキシ&静的コンテンツ用 Apache + バックエンドに Apache+mod_php な構成でも十分効果はあるはず。

id:redhat

すいません。早とちりでした。netstat -n | grep ':80'| grep -v TIME_WAIT |wcだと150位なので、現在のMaxClientsの設定でもコネクション数的にも問題なしのようです。

2008/03/20 04:08:47
id:pmakino No.5

まきのっぴ回答回数352ベストアンサー獲得回数282008/03/20 02:30:07

ポイント10pt

現在の同時接続数は mod_status を有効にすると把握しやすいと思います。

currently being processed な requests 数が MaxClients に肉薄しているようでしたら、MaxClients (と ServerLimit) を確実に増やした方が良いかと思います。

id:redhat

情報ありがとうございます。

2008/03/20 04:08:54

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません