さくらVPS apacheのチューニング(centOS6.5)
最近、サーバ自体にTERATERMでアクセスしてもタイムラグがあったりこのブログ自体も少し重たい感じでした。
色々とプラグインを入れていくと重くなるのは、しょうがないのですがブログのキャッシュプラグインとかブログに使っているテーマを直接編集してアクセスをよくすることも考えたらなかなか一筋縄ではないと気づき断念
サーバ運用しているのだから元からやってみよう!!
ということでhttpd.confの設定を見直そうということになりました。
デフォルトで入っている負荷テストツールApache Benchでまず計測してみました。
# ab -n 1000 -c 100 http://localhost/ This is ApacheBench, Version 2.3 <$Revision: 655654 $> 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 Server Hostname: localhost Server Port: 80 Document Path: / Document Length: 158 bytes Concurrency Level: 100 Time taken for tests: 0.277 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 399564 bytes HTML transferred: 159422 bytes Requests per second: 3616.36 [#/sec] (mean) Time per request: 27.652 [ms] (mean) Time per request: 0.277 [ms] (mean, across all concurrent requests) Transfer rate: 1411.10 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 1 3 0.9 3 6 Processing: 14 24 15.7 18 79 Waiting: 12 23 15.5 17 78 Total: 16 26 16.2 20 83 Percentage of the requests served within a certain time (ms) 50% 20 66% 23 75% 25 80% 28 90% 64 95% 73 98% 79 99% 80 100% 83 (longest request)
ベンチマーク自体の使い方は、割愛しますが1000件のリクエスト、100の同時クライアント接続で10回行うという指定です。
このベンチマークテストでの重要ポイントは、
Requests per second: 3616.36 [#/sec] (mean)
Time per request: 27.652 [ms] (mean)
だそうです。
1秒あたりに処理されたリクエスト数(Requests per second:)は、数値が大きいほうが良いらしいです。
また、1秒あたりに処理された所要時間 Time per request:は、数値が低いほうが良いとのこと。
この二つに注目してapacheのチューニングを行いました。
まずサーバー環境ですが、さくらVPS メモリ1G ディスク容量 100GB CPU 仮想2コアです。メモリが1GしかないのでSWAPファイルの頻繁なアクセスを少なくするのとwordpress自体のレスポンス向上を狙います。
apacheのプロセスの常駐の加減一つで遅くもなり速くもなるし他の方のチューニング記事を参考に色々の変更してみました。
編集するファイルは、/etc/httpd/conf/httpd.confです。
prefork.cの設定と不要なロードモジュールのコメントアウトです。
自宅サーバのときとあまり設定は、変わらないかもしれませんが・・・
まずprefork.cの設定
<IfModule prefork.c> StartServers 10 ← 8 MinSpareServers 5 ← 5 MaxSpareServers 15 ← 20 ServerLimit 256 ← 256 MaxClients 40 ← 256 MaxRequestsPerChild 1000 ← 4000 </IfModule>
当ブログの来訪数(平均200/日)なので接続数も単位時間にしたら微々たるものと思うので
開始時のプロセス数(start servers)を2つ減らしました。
最大接続数も256もいらないので40に変更
要は、客が来ないのに店員が多すぎるということ。
(アクセスにあわせて待ちうけプロセスも調整しましょうということ。)
またプロセス(MaxRequestsPerChild)のリサイクル生成周期を早めるため4000から1000に変更しました。
この辺は、apacheのhelpによるとプロセスに有限のライフタイムを設定することで、 サーバ負荷が下がった時にプロセス数を少なくすることができるとのこと。
次に、keepaliveの設定
apacheのhelpによると
たくさんの画像が 含まれる HTML ドキュメントでは場合によっては遅延時間が 50% 短縮される結果も でています。Keep-Alive 接続を有効にするには KeepAlive On と設定します。
なので画像などを使うブログでも効果があると思いこちらについてもOnとしました。
KeepAlive On MaxKeepAliveRequests 50 KeepAliveTimeout 10
今後のこの辺の数値は、Muninという監視ツールがあるそうなのでこちらでプロセス数を確認してmax clients数などを確認して調整していきたいと思います。
続いてロードモジュールの設定
必要ではないモジュールをコメントアウトします。
現在当ブログなどで使用していると思われるものは、BASIC認証、webdav(こちらは、今後に使用するため)など
こちらのapacheのサイトを参考にしました。
行頭#にしてあるものは、アンロード(ロードしていない)のものです。
普通のサイトでLDAPやPROXYは、通常は、使っていないのでコメントアウトでいいと思います。そのほかは、適宜で。
LoadModule auth_basic_module modules/mod_auth_basic.so #LoadModule auth_digest_module modules/mod_auth_digest.so LoadModule authn_file_module modules/mod_authn_file.so #LoadModule authn_alias_module modules/mod_authn_alias.so #LoadModule authn_anon_module modules/mod_authn_anon.so #LoadModule authn_dbm_module modules/mod_authn_dbm.so LoadModule authn_default_module modules/mod_authn_default.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_user_module modules/mod_authz_user.so LoadModule authz_owner_module modules/mod_authz_owner.so LoadModule authz_groupfile_module modules/mod_authz_groupfile.so #LoadModule authz_dbm_module modules/mod_authz_dbm.so #LoadModule authz_default_module modules/mod_authz_default.so #LoadModule ldap_module modules/mod_ldap.so #LoadModule authnz_ldap_module modules/mod_authnz_ldap.so LoadModule include_module modules/mod_include.so LoadModule log_config_module modules/mod_log_config.so LoadModule logio_module modules/mod_logio.so LoadModule env_module modules/mod_env.so #LoadModule ext_filter_module modules/mod_ext_filter.so #LoadModule mime_magic_module modules/mod_mime_magic.so LoadModule expires_module modules/mod_expires.so LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so LoadModule usertrack_module modules/mod_usertrack.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule mime_module modules/mod_mime.so LoadModule dav_module modules/mod_dav.so LoadModule status_module modules/mod_status.so LoadModule autoindex_module modules/mod_autoindex.so LoadModule info_module modules/mod_info.so LoadModule dav_fs_module modules/mod_dav_fs.so #LoadModule vhost_alias_module modules/mod_vhost_alias.so LoadModule negotiation_module modules/mod_negotiation.so LoadModule dir_module modules/mod_dir.so LoadModule actions_module modules/mod_actions.so LoadModule speling_module modules/mod_speling.so LoadModule userdir_module modules/mod_userdir.so LoadModule alias_module modules/mod_alias.so LoadModule substitute_module modules/mod_substitute.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so #LoadModule proxy_http_module modules/mod_proxy_http.so #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule alias_module modules/mod_alias.so LoadModule substitute_module modules/mod_substitute.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so #LoadModule proxy_http_module modules/mod_proxy_http.so #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so #LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule cache_module modules/mod_cache.so LoadModule suexec_module modules/mod_suexec.so LoadModule disk_cache_module modules/mod_disk_cache.so LoadModule cgi_module modules/mod_cgi.so LoadModule version_module modules/mod_version.so
設定が完了したらhttpdの再起動をお忘れなく、またconfは、設定前のものをhttpd.conf.20141124などと日付をいれてコピーしておくといいですよ。(再起動時にエラーが出て起動できないときに助かりますよ。)
/etc/init.d/httpd restart
これによりfreeコマンド確認すると
[root]# free total used free shared buffers cached Mem: 1020168 949752 70416 12 1656 17608 -/+ buffers/cache: 930488 89680 Swap: 2097148 888352 1208796
[root]# free total used free shared buffers cached Mem: 1020168 919956 100212 24 18964 77640 -/+ buffers/cache: 823352 196816 Swap: 2097148 315280 1781868
ここでの見方としてfreeの2行目の値(実メモリの free に buffers と cached を加えた容量)ここの値が改善しています。
この数値が実際の空いている容量と考えれば100メガほど確保できました。
またVMSTATコマンドで確認したら
[root]# vmstat 30 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 888288 69052 2000 18540 76 75 210 84 24 37 1 0 90 9 0 0 0 888036 65144 2080 22044 10 0 126 5 77 32 1 0 97 2 0 0 0 888032 64464 2120 22536 0 0 16 7 49 23 0 0 100 0 0 0 0 888028 64464 2160 22536 0 0 0 6 46 21 0 0 100 0 0 0 0 888024 64464 2200 22536 0 0 0 5 47 21 0 0 100 0 0 0 1 881980 68760 928 16012 1583 1178 1588 1185 239 186 1 1 75 23 0 0 0 876020 62012 968 16944 206 0 238 7 74 43 0 0 96 4 0 0 0 876016 61888 1008 16948 1 0 1 5 47 21 0 0 100 0 0 0 0 876016 61764 1048 16948 0 0 0 6 47 22 0 0 100 0 0 0 1 880564 66512 1032 16536 803 857 804 863 235 121 5 0 77 18 0 0 0 876920 63360 956 16916 1178 923 1200 929 224 146 2 0 75 22 0 0 0 896196 67020 1868 24100 1422 1705 1839 1712 252 294 2 1 83 14 0 0 0 896196 67068 1880 24100 0 0 0 11 44 16 0 0 100 0 0 0 0 896196 66124 2244 25556 0 0 60 1 50 18 0 0 100 0 0 0 0 897504 71644 2012 21948 233 287 249 290 101 59 1 0 92 6 0 0 0 897488 71708 2020 22032 3 0 5 2 73 21 1 0 98 1 0 0 1 897484 69872 2148 23756 14 0 74 1 58 22 0 0 97 3 0 0 0 897484 68144 2340 24832 0 0 43 2 53 21 0 0 99 1 0
vmstatのswapのsi,soの値の注目毎度ではないが何度かSWAPファイルの読み書きが実行されている。
これは、メモリの空き容量が少なくなってきていることになるらしい。
メモリリークはしていないのでそれほどじゃないかもしれませんが・・・・
[root]# vmstat 30 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 314092 142692 8088 57900 55 54 208 63 7 9 1 0 90 9 0 0 0 314088 142444 8112 58712 0 0 27 7 93 39 1 0 99 0 0 0 0 314088 142568 8128 58728 0 0 1 2 58 21 1 0 99 0 0 0 0 314088 142568 8136 58728 0 0 0 1 46 16 0 0 100 0 0 0 0 314088 142568 8216 58792 0 0 4 2 59 21 1 0 99 0 0 0 0 314088 141700 8232 59648 0 0 28 6 84 37 1 0 99 0 0 0 0 314088 140948 8248 59652 0 0 0 2 44 17 0 0 100 0 0 0 0 314088 140956 8256 59652 0 0 0 1 44 16 0 0 100 0 0 0 0 314088 140956 8264 59652 0 0 0 2 63 20 1 0 99 0 0 0 0 314088 141544 8280 59652 0 0 0 1 58 22 1 0 99 0 0 0 0 314088 141808 8288 59652 0 0 0 6 133 130 2 0 98 0 0 0 0 314088 141824 8296 59652 0 0 0 19 37 16 0 0 100 0 0 0 0 314088 140708 8304 59656 0 0 0 2 61 21 1 0 99 0 0 0 0 314088 140708 8320 59656 0 0 0 1 42 16 0 0 100 0 0 0 0 314088 140536 8328 59660 0 0 0 6 145 131 2 0 98 0 0
実際のところアクセスが多いときと閑散時とあるので定時の計測をしないとこれをもってレスポンスが良くなった!!とは、いえないがメモリの空き容量は明らかに多くなったのは、事実です。ただでさえメモリが少ない(1ギガバイト)環境なのでメモリの節約は、必要かと思います。
[root]# ab -n 1000 -c 100 http://localhost/ This is ApacheBench, Version 2.3 <$Revision: 655654 $> 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 Server Hostname: localhost Server Port: 80 Document Path: / Document Length: 158 bytes Concurrency Level: 100 Time taken for tests: 0.201 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 398376 bytes HTML transferred: 158948 bytes Requests per second: 4985.34 [#/sec] (mean) Time per request: 20.059 [ms] (mean) Time per request: 0.201 [ms] (mean, across all concurrent requests) Transfer rate: 1939.49 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 2 1.1 2 5 Processing: 4 17 3.4 17 27 Waiting: 4 17 3.3 16 26 Total: 9 19 3.4 18 31 Percentage of the requests served within a certain time (ms) 50% 18 66% 19 75% 21 80% 22 90% 24 95% 25 98% 28 99% 29 100% 31 (longest request)
Requests per second: 3616.36 [#/sec] (mean)
Time per request: 27.652 [ms] (mean)
↓
Requests per second: 4985.34 [#/sec] (mean)
Time per request: 20.059 [ms] (mean)
apache ベンチマークテストでもいい値になりました。
チューニング方向性も間違っていなかったようです。
アクセス数やCPU、メモリなどでサーバごとに変わってくると思いますが参考になればと思います。