ABコマンドでApacheのPreforkMPMをチューニング

※記事内に商品プロモーションを含む場合があります

LinuxでApache Webサーバをインストールすると使えるようになる
ABコマンド。

ABコマンドは同時アクセスなど、多量のアクセスを作り出す事で
サーバーの能力を確認することができましす。

やっている事はDos攻撃とほぼ同じで
サーバを止めたり、反応が無くなる可能性があります。

第三者のサーバーに行うと、
サーバー停止に伴う損害賠償請求などを起こされるかもしれません。

abコマンドの使い方

abコマンドab -n 10000 -c 100 https://b.eax.jp/ を実行中の画面

abコマンドは基本的にはこのように使います。

ab -n 500 -c 100 https://b.eax.jp/

-n は総リクエスト数 上の例では合計500アクセス発生します。
-c は同時リクエスト数 上の例は100アクセスが同時に発生します。
最後がURLです。

このコマンドでは、100リクエストを同時に発生させ
500リクエストに達したらテストを終了します。

結果はRequests per secondを見る

abコマンドの結果はいろいろ出力されます。
一番簡単なのがRequests per secondで比べることです。

Requests per secondは1秒間に何回リクエストを処理できたか
を示すものです。

さくらのVPS上で動作しているこのサーバは
キャッシュされた静的なファイルならRequests per secondは150#/secぐらい。
動的なリクエストだと20#/secぐらいまで下がります。

なかなか、目安と言える数値が無いので
設定を変更して、Requests per secondを比較することで
チューニングを行います。

【参考】Webサーバー向けのベンチマークツールを使ってみよう(前編)――Apache BenchとSiege

Prefork MPMのチューニング方法

abコマンドでサーバーが落ちる事もあるのでチューニングを
行うサーバーは、できれば公開前のサーバーが良いです。

すでに公開されているサーバーをチューニングする場合は
なるべくアクセスの少ない時間帯、時間の余裕のある時に行います。

方法

まず、現在サーバに設定されている同時接続の最大値を大きくします。
具体的には、ServerLimitとMaxClientsの数値を大きくします。

abコマンドでテストをしていきます。

最初は-nで指定する総リクエストを変更前のMaxClients
に近い数値からテストします。

すぐに大きくしすぎると、負荷が高まり
サーバが反応しなくなる可能性があります。

Requests per secondやサーバのロードアベレージ、
メモリ使用率などを加味して同時接続数の最大値を決めていきます。

メモリーリークに有効なMaxConnectionsPerChild 

WordPressをPHP5で動かしていた時はメモリーリークしているのか
メモリ使用率が減らない事がありました。

現在はphp7とAPCu、OPcacheを使っているのでほとんど
メモリリークはありません。
【関連】PHP7とAPCu , OPcacheでWordPress高速化

メモリ使用率を監視して、一向に減らない場合は
MaxConnectionsPerChildを低めに設定します。

MaxConnectionsPerChildはを設定する事で、設定した回数
リクエストを捌いたら該当するプロセスを殺します。

MaxConnectionsPerChildは速度低下の原因にもなる

定期的にプロセスを殺すことで、メモリリークの対策には
効果的です。

しかし、定期的にプロセスを殺すので、プロセスを起こす、フォーク
するのに時間がかかりサーバとしての速度が低下する可能性があります。

このサーバではPHP7の現在は250、PHP5の時は、50に設定していました。

値を大きくするとプロセスの生存期間が延びるので
メモリリークなどがあるとメモリを逼迫します。

メモリ使用率などを監視しつつ、慎重に変更します。

場合によっては、メモリ不足になり、スワップの処理にシステムの
処理を奪われるスラッシングが起こることがあります。

現在の設定値

このサーバの設定値を紹介します。
現在はPHP7を使用中、サーバはさくらのVPS 2Gのプランです。

<IfModule prefork.c>
StartServers 10
MinSpareServers 5
MaxSpareServers 30
ServerLimit 100
MaxClients 100
MaxConnectionsPerChild 250
</IfModule>

まとめ

PreforkMPM設定の要は、同時接続数の最大値です。
実際の項目は、ServerLimitとMaxClientsです。

いかにサーバーの処理を保ちつつ、
より多くのリクエストをさばくかです。

メモリリークが気になる場合や、
スラッシングでサーバが反応せず、強制再起動させた場合は
MaxConnectionsPerChildを小さめに設定します。

MaxConnectionsPerChildを小さめに設定することで
定期的にプロセスを殺すのでメモリリークなどには効果的です。

あまり小さい数値にしすぎると、殺した分のプロセスを起こさなければ
ならないので処理速度としては遅くなります。

あとは、メモリやロードアベレージなどを監視しつつ
変更してみるのが良いと思います。