同時接続数(MaxClients)をいくつに設定すべきか?

【この記事の所要時間 : 約 9 分

apache_maxclients

Apacheの同時接続数(MaxClients)をどのように設定するのがいいのか調べた。
Apacheのプロセス数を制限するためのディレクティブが「MaxClients」で、このディレクティブには、同時に接続できるクライアント(厳密にはセッション)の数を指定しなければならない。

●まずはApacheドキュメントを確認しよう

Apacheのドキュメントでは、以下のように定義されていた。

MaxClients ディレクティブ

説明: リクエストに応答するために作成される子プロセスの最大個数
構文: MaxClients number
デフォルト: 詳細は使用法をご覧下さい。
コンテキスト: サーバ設定ファイル
ステータス: MPM
モジュール: beos, leader, prefork, threadpool, worker

MaxClients ディレクティブは、 応答することのできる同時リクエスト数を設定します。 MaxClients 制限数を越えるコネクションは通常、 ListenBacklog ディレクティブで設定した数までキューに入ります。 他のリクエストの最後まで達して子プロセスが空くと、 次のコネクションに応答します。
スレッドを用いないサーバ (すなわち prefork) では、MaxClients は、リクエストに応答するために起動される 子プロセスの最大数となります。 デフォルト値は 256 で、これを増加させたい場合は、 ServerLimit の値も増加させる必要があります。
スレッドを用いるサーバや、ハイブリッドサーバ (すなわち beos worker) では、MaxClients は、クライアントに応答できるスレッドの総数を制限します。 beos でのデフォルト値は 50 です。 ハイブリッド MPM でのデフォルト値は 16 ServerLimit の 25 倍 (ThreadsPerChild) です。 MaxClients を 16 プロセス以上必要な値まで増加させたい場合は、 ServerLimit も増加させる必要があります。

ということで、現状の設定を調べてみると、デフォルト通りにMaxClientsは256だった。

●チューニングのポイントは?

@IT : Apacheパフォーマンス・チューニングのポイント
Apacheのチューニングポイントにて以下のように書いてあった。

「Apacheでは何もチューニングできないのか」と思われるかもしれないが、実はもう1つのアプローチが存在する。それは、「いかに多数の同時接続を処理するか」である。ご存じのとおり、Apacheは単独のリクエストを順次処理するのではなく、同時に多数のリクエストを受け入れる性質のソフトウェアである。これは、データベース・サーバでOLTPを行うのに似ている。1つ1つの処理速度を向上させるのと同様に、同時に多数のリクエストを処理できるようにすることが重要となるのである。

CPU、メモリ、ディスクI/O、回線については、Apacheをチューニングすることでカイゼンすることはできないが、Apacheでチューニングできるのが「同時接続処理」であるということである。

●ベンチマークツール(ab)の使い方とは?

@IT : Apacheのベンチマーク・ツール「ab(Apache Bench)」
abは、以下のようにして使う。

ab -n 100 -c 10 -w http://172.16.1.2/index.html > bench.html

そして出力結果のどこに着目するかといえば、以下の3点。

* リクエストの成否(Complete requestsとFailed requests)
abで発生させたリクエストがすべて成功していればいいが、一部が失敗するようならWebサーバの処理が追い付いていない。これは、特にプログラムを実行してページを生成する場合に起こりやすく、同時接続数の限界を超えていると考えるべきだろう。
* 1秒間に処理されたリクエスト数(Requests per second)
Webサーバのベンチマークで、最も重視されるのがこの項目である。CPUのMIPSやデータベースのTPCと同じく、1秒間にどれだけ処理できたかが重要な数値になる。パラメータやプログラムを修正したりしてその効果を測る際にも、この項目の数値がどれだけ改善するか(数値が大きくなるか)で評価を行う。
* 接続時間・処理時間・待ち時間の内訳(Connect/Processing/Waiting)
これらの項目は、測定したリクエスト全体でのばらつきやリクエスト当たりの処理の内訳を見極めるために用いる。

実際、あるサーバにてabを使って負荷テストをしてみた結果が以下。
ab -n 1000 -c 100 →リクエスト正常終了(Requests per second 36.74)
ab -n 3000 -c 300 →リクエスト正常終了(Requests per second 37.77)
ab -n 5000 -c 500 →リクエスト正常終了(Requests per second 37.58)
ab -n 6000 -c 600 →リクエスト正常終了(Requests per second 38.13)
ab -n 7000 -c 700 →リクエスト正常終了(Requests per second 37.19)
ab -n 8000 -c 800 →リクエスト失敗(apr_recv : Connection timed out)
ab -n 9000 -c 900 →リクエスト失敗(apr_recv : Connection timed out)
ab -n 10000 -c 1000 →リクエスト失敗(apr_recv : Connection timed out)
リクエストの成否が同時接続数700から800にかけて分かれているので、このサーバとしては、同時接続可能数の飽和点は700程度と考えるのがいいと判断した。

●同時接続可能数は上限ギリギリにしてOKか?

@IT : セッションのチューニングには以下のように書いてある。

abで同時接続数を上げながら、CPUやメモリの状態、abが示すパフォーマンスの推移を調査する。それに伴ってMaxClientsの値も上げながら、飽和点を探る作業を行うのだ。しかし、飽和点いっぱいに設定するのはお勧めできない。本当に飽和してしまうとサーバがフリーズしたようになってしまい、サービスできるはずのクライアントにもサービスが提供できなくなるからである。少し余裕を持って動作できるくらいがちょうどいいのだ。

とのことなので、700ぎりぎりに設定するのはダメみたいで、余裕を持たせて600くらいが限度かもしれない。
apacheのエラーログ(error_log)をチェックしたら以下のようなエラーが発生していた。

[error] server reached MaxClients setting, consider raising the MaxClients setting

@IT : httpd.confによるWebサーバの最適化には以下のようにある。

error_logに

[Thu Aug 25 19:40:06 2005] [error] server reached MaxClients setting, consider raising the MaxClients setting

のようなエラーが出力されるようなら、MaxClientsの値を上げる必要があります。ただし、ServerLimitより大きな値を設定することはできないため、MaxClientsの値を上げる際は併せてServerLimitも変更する必要があります。

ServerLimit 150
MaxClients 150

 Apacheは、最大でMaxClients個のプロセスを起動させます。高アクセスのサーバでは当然高い値を設定し、クライアントの要求に応えられるようにする必要があります。ただし、高い値にし過ぎると、メモリを使い切りスワップが発生するなど、かえってレスポンスが悪化します。 MaxClientsの設定に際しては、以下の式が目安になるでしょう。

MaxClients=使用可能なメモリ量/Apacheの1プロセスが使用するメモリ量

調べてみると、Apacheのプロセス(httpd)が使用している物理メモリサイズは約10MB。使用可能なメモリ量は、簡易的にサーバのメモリ量1GBと考えると、
MaxClients = 1GB/10MB = 100
となる。

●調査した結果の結論

MaxClientsの目安は100で、負荷テストで見る限り余裕を持って最大値は、600というところなのかな? ということで、MaxClients(同時接続数)に関しては、100で様子をみつつ、エラーログに、以下のエラーが出たら、700までの値で少しづつ上げて調整するというのがよさそうな気がする。

[error] server reached MaxClients setting, consider raising the MaxClients setting

最大時にはMaxClientsとMaxSpareServersを足した数のプロセスが起動しているので、MaxSpareServersの値も気にしつつ、もしデフォルトの256で上記、エラーログがでるようなら、かなりのアクセスがあると見ていいので、MaxClients数を上げていくのがいいのではないかと思う。
それで600まで上げてもエラーログがでるようなら、もうその1台のサーバでは対応できない(Apache的に)ので、テストサーバなど別サーバと同期を取り、DNSラウンドロビンで簡易的に負荷分散しつつ、長期的にはロードバランサの導入などを検討しなければならないと思う。

DNSラウンドロビンとは、一つのドメイン名に複数のIPアドレスを割り当てる負荷分散技術の一つである。トラフィック負荷を複数のIPアドレスに振り分けることにより、例えばHTTPサーバに対するアクセスをほぼ同量ずつ複数のサーバマシンに分配することができる。これはBIND等DNSサーバのゾーン設定により容易に実現できる負荷分散方式である。

より詳しく知りたい方はこちらへ

スポンサーリンク
レクタングル(大)広告
  • このエントリーをはてなブックマークに追加
スポンサーリンク
レクタングル(大)広告

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です