人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

画像配信サーバを運用していますが、アクセス数急増により、表示が遅いというクレームが入って困っています。。最適な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点を特に教えて頂きたいです。

●質問者: redhat
●カテゴリ:コンピュータ
✍キーワード:Apache BO cache CPU CS
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● まきのっぴ
●1ポイント

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

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

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

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


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

◎質問者からの返答

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


2 ● y-kawaz
●35ポイント

・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はブラウザのキャッシュにかかわるヘッダですが、複数サーバで負荷分散をする場合は逆にこのヘッダが原因でキャッシュが効かなくなくなるということが起こりますので。


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

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

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

◎質問者からの返答

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

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

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


3 ● b-wind
●34ポイント

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

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


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

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

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

netstat -n | grep ':80'| wc

11736 70416 1044504

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

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


4 ● b-wind
●20ポイント

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

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

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

Manpage of NETSTAT


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

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

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

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

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

◎質問者からの返答

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


5 ● まきのっぴ
●10ポイント

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

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ