さくらのVPS(1G)におけるApacheの同時接続数の設定値について
Apacheの同時接続数(MaxClients)を適切な値に設定することにより、大量の同時アクセスが発生しても(ある程度の)秒間のリクエスト数(スループット)を維持できるようにしておく。
1.環境
本サイトの環境(概要)は以下のとおり(2013/9/11時点)。
- さくらのVPS(1G)
- Ubuntu 12.04.3 LTS
- Apache/2.2.22
- WordPress 3.6
2.準備
スループットを計測するためのabコマンド(ApacheBench)と、CPU使用率等を確認するためのsarコマンドをインストールする。
# apt-get install apache2-utils
# apt-get install sysstat
3.計測(設定変更前)
CPUの各種使用率およびスワップの状態を確認するためのコマンド(sar -P ALL 1 1000
、sar -S 1 1000
)を裏で実行しつつ、abコマンドを実行してみる。まずは同時接続数30、リクエスト数200とする。
# ab -c 30 -n 200 http://www.k4750.net/
...
Concurrency Level: 30
Time taken for tests: 51.828 seconds
Complete requests: 200
Failed requests: 0
Write errors: 0
Total transferred: 6494600 bytes
HTML transferred: 6444200 bytes
Requests per second: 3.86 [#/sec] (mean)
Time per request: 7774.199 [ms] (mean)
Time per request: 259.140 [ms] (mean, across all concurrent requests)
Transfer rate: 122.37 [Kbytes/sec] received
...
すべてのリクエストを捌くのに約52秒、秒間のリクエスト数は3.86回となっている。sarの状況(抜粋)は、
# sar -S 1 1000
10:49:57 PM kbswpfree kbswpused %swpused kbswpcad %swpcad
...
10:50:15 PM 675580 369920 35.38 50872 13.75
10:50:16 PM 639152 406348 38.87 57688 14.20
10:50:17 PM 669316 376184 35.98 69396 18.45
...
%swpused(スワップ領域の使用率)が30%を超え(計測前は7%程度)、
# sar -P ALL 1 1000
...
10:50:14 PM CPU %user %nice %system %iowait %steal %idle
10:50:15 PM all 20.45 0.00 12.50 66.48 0.57 0.00
10:50:15 PM 0 22.99 0.00 12.64 63.22 1.15 0.00
10:50:15 PM 1 17.78 0.00 12.22 68.89 1.11 0.00
10:50:15 PM CPU %user %nice %system %iowait %steal %idle
10:50:16 PM all 20.97 0.00 13.98 63.44 1.61 0.00
10:50:16 PM 0 21.11 0.00 17.78 60.00 1.11 0.00
10:50:16 PM 1 21.05 0.00 11.58 66.32 1.05 0.00
10:50:16 PM CPU %user %nice %system %iowait %steal %idle
10:50:17 PM all 48.70 0.00 9.84 38.86 2.59 0.00
10:50:17 PM 0 45.83 0.00 15.62 36.46 2.08 0.00
10:50:17 PM 1 50.50 0.00 4.95 40.59 3.96 0.00
...
%iowait(ディスクI/O待ちの割合)が60%を超えている(計測前は0%)。メモリが足りず、スワップが発生しているようだ。abコマンドの同時接続数を徐々に下げていくと、20あたりで諸々の調子が良くなるようだ(このときのsarの結果は、%swpused=10%程度、%iowait=ほぼ0%)。
# ab -c 20 -n 200 http://www.k4750.net/
...
Concurrency Level: 20
Time taken for tests: 26.496 seconds
Complete requests: 200
Failed requests: 0
Write errors: 0
Total transferred: 6494600 bytes
HTML transferred: 6444200 bytes
Requests per second: 7.55 [#/sec] (mean)
Time per request: 2649.577 [ms] (mean)
Time per request: 132.479 [ms] (mean, across all concurrent requests)
Transfer rate: 239.37 [Kbytes/sec] received
...
4.Apacheの設定値
Apacheの設定値等を確認してみると、
# apache2 -V
Server version: Apache/2.2.22 (Ubuntu)
...
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
...
# cat /etc/apache2/apache2.conf
...
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
...
prefork MPM(Multi-Processing Module)を使用しており、同時接続数(MaxClients)は150であることが分かる。abコマンドの同時接続数が20あたりで調子が良いことから、このMaxClientsを20に設定変更する。これにより、最大で150プロセス起動してしまう設定であったのが、最大20に抑えられることになり、「メモリスワップが発生しない=スループットが(極端に)低下しない」状況になるはずだ。
5.計測(設定変更後)
abコマンドの同時接続数を30~100と変化させてみたが、秒間リクエスト数(スループット)に極端な低下はみられない。また、%iowaitや%swpusedの値からも、メモリスワップが発生していないことが分かる。ただし、リクエスト時間(abのTime per requestの値)は徐々に長くなる。これは、サーバ側の調子は良いが、クライアント側は長く待たされる状況ということだ。
同時接続数 | テスト時間(秒) | 秒間リクエスト数 | リクエスト時間 (ミリ秒)(平均) |
%iowait (平均) |
%swpused (平均) |
30 | 25.363 | 7.89 | 3790.755 | 0.00 | 8.00 |
40 | 24.936 | 8.02 | 5020.484 | 0.00 | 8.00 |
50 | 25.427 | 7.87 | 6290.902 | 0.00 | 8.00 |
60 | 24.223 | 8.26 | 7289.311 | 0.00 | 8.00 |
100 | 24.869 | 8.04 | 12183.391 | 0.00 | 8.00 |
6.まとめ
簡単ではあるがまとめると「さくらのVPS(1G)環境でApache+WordPressを動作させておく場合は、MaxClientsを20程度にすると(サーバ側の)調子がよい」。
7.今後の予定
今回の設定により、サーバ側に無茶な負荷がかからないようになったので、今後はクライアント側のレスポンス改善を実施する予定。