カメノドットコム
Debian大好きでメインで節操ない感じ。
GMOもわりと好き。
RSS feedly

【Apache2.4】event_mpmをチューニング

以前の Apache2.4のevent_mpmをチューニング がありますが、UnixBench の結果があまりにも違うので、新たにチューニングを試みます。
ab コマンドはDOS攻撃にもなります。自分とこのテスト以外に使わないでください。

---- [PR] ----
現在契約中 : GMOクラウドのVPS : お名前.com
今後契約するかも : お名前.com VPS
--------------

10万アクセス捌けるか実験

C10K問題 に対して event_mpm がどこまで迫れるのか実験です。
「1万 のクライアントが、同時に 10 のアクセス」という世界にチャレンジします。
ログファイルが大きくなるとパフォーマンスが落ちますので、停止→ログ削除→起動、の手順を踏みます。
テスト用ページは セメント樽の中の手紙(青空文庫) をお借りしました。HTML5に書き換えてあります。
後ほど行う php-fpm のテスト用に PHPファイル と SQLite3 のデータベースも含まれています。
テスト用ターボール の中身は以下のようになってます。

test/
    +- test.html         13 KB
    +- style.css        277  B
    +- test.php         144  B
    +- test_db.sqlite3  1.3 MB

Apacheが event_mpm 担っているか確認して、「httpd.conf」で「httpd-mpm.conf」を読み込んでいるかどうか確認します。

$ sudo /usr/local/apache24/bin/apachectl -V | grep MPM
Server MPM:     event
$ sudo vi /usr/local/apache24/conf/httpd.conf
# コメントアウトを外しておきます
Include conf/extra/httpd-mpm.conf

「httpd-mpm.conf」は event_mpm 以外、コメントアウトして下記のみ残します。

# この部分だけ有効にしておく
<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>

デフォルトの設定でどこまで捌けるのか試してみます。
外からだと回線が安定しないので、VPS内で /usr/local/apache24/bin/ab -c 10000 -n 100000 http://localhost/test/test.html を繰り返します。
テストが終わるごとに、ログファイルも削除します。
デフォルト設定、レッツトライ。

$ /usr/local/apache24/bin/ab -c 10000 -n 100000 http://localhost/test/test.html
Benchmarking localhost (be patient)
socket: Too many open files (24)

あっはっは。どうしようもないですな。
前回、いい線いった設定でやってみましょう。

<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads          3
    MaxSpareThreads         15
    ThreadsPerChild         10
    MaxRequestWorkers      150
    MaxConnectionsPerChild   0
</IfModule>
$ /usr/local/apache24/bin/ab -c 10000 -n 100000 http://localhost/test/test.html
Benchmarking localhost (be patient)
socket: Too many open files (24)

うぬぅ。だめか。王道設定で逝ってみよう。

<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads          3
    MaxSpareThreads          3
    ThreadsPerChild          3
    MaxRequestWorkers        9
    MaxConnectionsPerChild   0
</IfModule>
$ /usr/local/apache24/bin/ab -c 10000 -n 100000 http://localhost/test/test.html
Benchmarking localhost (be patient)
socket: Too many open files (24)

手も足も出ませんな。
必殺、全てコア数で揃えるで試してみます。

<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads          3
    MaxSpareThreads          3
    ThreadsPerChild          3
    MaxRequestWorkers        3
    MaxConnectionsPerChild   0
</IfModule>
$ /usr/local/apache24/bin/ab -c 10000 -n 100000 http://localhost/test/test.html
Benchmarking localhost (be patient)
socket: Too many open files (24)

ぜ・ん・め・つ、しました。
UnixBench の Index が半分以下になってるから、無理かー。無理なのかー。
どちらにせよ、3vCPU で メモリ2GB では10万アクセスは捌けないんですけどね。

自分のサイトにあわせた設定にする

今のウチの状況だと、10のクライアントが5のアクセス、合計50でも充分なんですが。
サイトが完成した暁には、最大で100のクライアントが10アクセス、合計1000になればいいなーということで。
/usr/local/apache24/bin/ab -c 100 -n 1000 http://localhost/test/test.html で試してみます。
3コアなので、3の倍数で少しいじってテストしてみました。検証用に表にしておきます。
「StartServers 3」「MinSpareThreads 3」「MaxConnectionsPerChild 0」は固定してテストしましたので、残りの設定だけ書いてます。

Time taken for tests Requests per second Time per request
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
0.289 sec 3462.77 #/sec 0.289 ms
MaxSpareThreads 3
ThreadsPerChild 3
MaxRequestWorkers 3
30.234 sec 33.08 #/sec 30.234 ms
MaxSpareThreads 3
ThreadsPerChild 3
MaxRequestWorkers 9
0.331 sec 3023.87 #/sec 0.331 ms
MaxSpareThreads 6
ThreadsPerChild 3
MaxRequestWorkers 18
0.351 sec 2849.50 #/sec 0.351 ms
MaxSpareThreads 6
ThreadsPerChild 6
MaxRequestWorkers 36
0.345 sec 2894.44 #/sec 0.345 ms
MaxSpareThreads 9
ThreadsPerChild 3
MaxRequestWorkers 27
0.280 sec 3568.12 #/sec 0.280 ms
MaxSpareThreads 9
ThreadsPerChild 6
MaxRequestWorkers 54
0.323 sec 3096.95 #/sec 0.323 ms
MaxSpareThreads 9
ThreadsPerChild 9
MaxRequestWorkers 81
0.303 sec 3298.06 #/sec 0.303 ms

前回とは全く違う結果になりましたー。必殺の「コア数に揃えておけ」が惨敗。アレはスペックが良くないと使えないようです。
意外なのはデフォルト設定が健闘していること。一般的な設定ということですかね。
他の設定でも試してるので event_mpm 試したリスト を見て笑ってやってください。

一番結果が良かった設定で、クライアントを100ずつ増やして耐久テストをしてみました。
ab -c 400 -n 4000 で「Failed requests: Length: 48」が出てきまして。
ab -c 700 -n 7000 で「Total of 6892 requests completed」が出てコンプリートできませんでした。
ウチのサイトでは充分な結果です。
でも10万アクセス捌けるVPSサーバ、借りてみたいなぁ。最低でも メモリ4GB いるよねー。
メモリ4GB 必要なサイトに成長させたいものです。

結論

チューニングは自力でやるべし。
他サイトの結果はあくまでも参考とし、自分で色々と試すしか無い。
過去に自分でやった結果さえ、使えないのですから。

Sponsored Link