■Webサーバのチューニング
仮想サーバで動かすのが一般的となりつつある昨今で、大規模なWebサーバを運用するとなった場合にリソースを追加してあげればそれなりに強固なWebサーバになりますが、ソフトウェアのチューニングも効果を発揮します。
まず以下のコマンドでWebサーバ(apache)をインストールします。
# yum install httpd httpd-tools # rpm -qa httpd httpd-2.4.6-80.el7.centos.1.x86_64 httpd-tools-2.4.6-80.el7.centos.1.x86_64 |
チューニングを行う際にコア部分となるのがMPM(Multi Processing Module)と呼ばれるものであり、クライアントからのリクエストをApacheがどのように処理するかをモジュール化したものです。
デフォルトのMPMはpreforkと呼ばれるモジュールで、以下のコマンドで確認が可能です。
# apachectl -V Server version: Apache/2.4.6 (CentOS) Server built: Jun 27 2018 13:48:59 Server's Module Magic Number: 20120211:24 Server loaded: APR 1.4.8, APR-UTIL 1.5.2 Compiled using: APR 1.4.8, APR-UTIL 1.5.2 Architecture: 64-bit Server MPM: prefork threaded: no forked: yes (variable process count) <以下省略> |
preforkを含め、MPMには以下のものがあります。
MPM
|
概要
|
prefork | マルチスレッドではなくfork(コピー)を行いパフォーマンスを向上。 |
worker | マルチスレッドとマルチプロセスのハイブリッド型。 |
event | Apache2.4からサポート。マルチスレッドで動作する。 |
今回はデフォルトのpreforkをそのまま利用し、オプションの値を調整していきます。まず設定項目として以下のものがあげられます。
オプション
|
概要
|
デフォルト値 | 設定例 |
StartServers | Apacheが起動した際のプロセス数 | 5 | 10 |
MinSpareServers | 待機させておくプロセス起動の最小値 | 5 | 35 |
MaxSpareServers | 待機させておくプロセス起動の最大値 | 10 | 70 |
ServerLimit | 最大プロセス数 (MaxClinetsと同一) | 256 | 256 |
MaxClients | 最大同時リクエスト数 (ServerLimitと同一) | 256 | 256 |
MaxRequestsPerChild | 1プロセスが処理できる最大リクエスト数 | 10000 | 0 (無制限) |
これを/etc/httpd/conf/httpd.confの最後に追記します。
# vi /etc/httpd/conf/httpd.conf <IfModule mpm_prefork_module> StartServers 10 MinSpareServers 35 MaxSpareServers 70 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 0 </IfModule> |
これらの数字をどれぐらいに設定すれば良いのかというのは非常に難しいところなのですが最も重要なのはMaxClientsであり、膨大なアクセスが無い限りはデフォルトの256のままでOKです。MaxSpareServersはMaxClientsの10%~30%程度、MinSpareServersはMaxSpareServersの半分程度にするのが一般的です。
これでもなおアクセスに耐えきれなければ徐々に増やしていくという手順で良いと思うのですが、CPUやメモリ量などによってはサーバダウンの原因にもなるので慎重な調整が必要です。
■ベンチマークテスト
Webサーバの性能を測定するベンチマークツールとしてApacheではそのツールが同封されています。そのコマンドは「ab」というツールで気軽に試すことの出来るツールなので是非利用してください。使い方は以下となります。
# ab -n 1000 -c 100 http://localhost/ (-nは総リクエスト数,-cは同時リクエスト,上記は同時100アクセスを10回繰り返す挙動となる) This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: Apache/2.4.6 Server Hostname: localhost Server Port: 80 Document Path: / Document Length: 10 bytes Concurrency Level: 100 Time taken for tests: 0.143 seconds Complete requests: 1000 Failed requests: 0 ※注目ポイント Write errors: 0 Total transferred: 300000 bytes HTML transferred: 10000 bytes Requests per second: 7008.49 [#/sec] (mean) ※注目ポイント Time per request: 14.268 [ms] (mean) Time per request: 0.143 [ms] (mean, across all concurrent requests) Transfer rate: 2053.27 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 4 1.3 4 6 Processing: 4 10 2.0 10 14 Waiting: 2 8 2.2 8 14 Total: 7 13 1.6 14 18 Percentage of the requests served within a certain time (ms) 50% 14 66% 14 75% 14 80% 14 90% 15 95% 15 98% 16 99% 17 100% 18 (longest request) |
上記結果から注目すべき点は黒字で塗った部分です。Request per secondは1秒間あたりのリクエスト数で値が大きいほどパフォーマンスが良いということです。
また、最初の方に「Complete XXX Requests」と表示されていますが、ここでFailed Requestと表示されている場合、既に限界を越えてるということになります。