K4750.NET

さくらの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 1000sar -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.今後の予定

今回の設定により、サーバ側に無茶な負荷がかからないようになったので、今後はクライアント側のレスポンス改善を実施する予定。