アーカイブ

2014 年 11 月 24 日 のアーカイブ

さくらVPS apacheのチューニング(centOS6.5)

2014 年 11 月 24 日 Comments off

最近、サーバ自体に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、メモリなどでサーバごとに変わってくると思いますが参考になればと思います。

カテゴリー: Linux タグ: , , ,