apacheの同時接続数(MaxClients)を検証する
最近は、サーバネタで押してきます(^^;
先日、httpdのエラーログで不正なアクセスなどないか確認していたときに見慣れないログをapacheが吐いていた。
vi /var/log/httpd/error_log [Tue Dec 16 16:53:09 2014] [error] server reached MaxClients setting, consider raising the MaxClients setting
こちらのサイト同時接続数(MaxClients)をいくつに設定すべきか?によるとMAXClientsの数値が低い場合にこのメッセージが出力されるらしい。
ということで参考にしていろいろと調べてみた。
するとhttpd.confの設定でapacheのホームページでは、”MaxClients は、リクエストに応答するために起動される 子プロセスの最大数となります。 デフォルト値は 256 で、これを増加させたい場合は、 ServerLimit の値も増加させる必要があります。”
となっています。
実際のconfを覗いてみると
<IfModule prefork.c> StartServers 10 MinSpareServers 5 MaxSpareServers 15 ServerLimit 256 MaxClients 50 MaxRequestsPerChild 1000 </IfModule>
ちなみに以前にも同様のログが出たのでMaxClientsの値を40 → 50に変更していました。
しかし、今回のエラーログが出たのでまたチューニング(MaxClientsを増やす?)が必要なようです。
まずhttpdプロセスのメモリ使用量は、というと
[root@local]# top -a top - 18:24:25 up 32 days, 11:46, 3 users, load average: 0.01, 1.13, 7.70 Tasks: 119 total, 1 running, 117 sleeping, 1 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1020168k total, 528124k used, 492044k free, 9860k buffers Swap: 2097148k total, 343364k used, 1753784k free, 56536k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28188 apache 20 0 311m 47m 3892 S 0.0 4.8 0:03.98 httpd 28095 apache 20 0 301m 36m 5020 S 0.0 3.7 0:02.77 httpd 28098 apache 20 0 300m 36m 4968 S 0.0 3.6 0:04.68 httpd 28096 apache 20 0 300m 36m 3932 S 0.0 3.6 0:05.69 httpd 28091 apache 20 0 299m 35m 3972 S 0.0 3.6 0:07.64 httpd 28097 apache 20 0 297m 34m 3944 S 0.0 3.4 0:05.14 httpd 28092 apache 20 0 297m 33m 3848 S 0.0 3.4 0:06.32 httpd 28093 apache 20 0 297m 33m 3884 S 0.0 3.4 0:04.64 httpd 28094 apache 20 0 297m 33m 3956 S 0.0 3.4 0:06.54 httpd 28185 apache 20 0 296m 32m 3832 S 0.0 3.2 0:00.77 httpd 28099 apache 20 0 295m 32m 3940 S 0.0 3.2 0:03.93 httpd 28090 apache 20 0 295m 31m 3964 S 0.0 3.2 0:03.76 httpd 28186 apache 20 0 287m 23m 3940 S 0.0 2.4 0:02.42 httpd 28088 root 20 0 274m 10m 5468 S 0.0 1.1 0:00.15 httpd 18448 mysql 20 0 1337m 10m 2940 S 0.0 1.1 30:32.41 mysqld 28187 apache 20 0 274m 7172 1460 S 0.0 0.7 0:00.01 httpd 28190 apache 20 0 274m 7140 1432 S 0.0 0.7 0:00.00 httpd
大体ですがRESの項目が使用量らしいので大雑把にみて1つのプロセスで35Mくらいでしょうか?
けれどきちんと計算したいなぁと思ったら計算式で出せる技を持っている方がいらっしゃったので使わせていただきました。
[root@local ~]# ps aux | grep [h]ttpd | grep [a]pache | awk 'BEGIN{x=0}{x+=$6}END{print x/NR}' 35786.1
ざっくりの計算とほぼ同じですね。たまたま合ってました(笑)
そしてこのhttpdに使用できるメモリ量は、
freeコマンドより算出できるようです。
[root@www16071ue ~]# free total used free shared buffers cached Mem: 1020168 615464 404704 92 12332 63740 -/+ buffers/cache: 539392 480776 Swap: 2097148 342804 1754344
-/+ buffers/cache: のfreeの部分だそうです。
ただし現在もhttpdでプロセスが起動しているので現在のhttpd.confの設定+αというところでしょうか。
maxclients= 50(現在のhttpd.confの設定)+ 480776(空いているメモリ量)/35786.1(子プロセスの平均メモリ量)
= 50 + 13.43….
≒ 63
この計算でいくと今の設定+13くらいが妥当なようです。
ただし他にも起動させているMYSQLだとかもあるので一筋縄では、いかないと思いますが、とりあえず+10で様子を見るようにします。
それとhttpd.confの設定ですがServerLimitとMaxClientsは、同値の方が多いのでここは、同じく60で設定して様子を診てみようかと思います。
ということ下記になります。
<IfModule prefork.c> StartServers 10 MinSpareServers 5 MaxSpareServers 15 ServerLimit 60 MaxClients 60 MaxRequestsPerChild 1000 </IfModule>
エラーログに出てこないことを祈ります。
追記20141224
また同様のログが出たので若干の修正をしました。
<IfModule prefork.c> StartServers 10 MinSpareServers 5 MaxSpareServers 15 ServerLimit 100 MaxClients 100 MaxRequestsPerChild 750 </IfModule>
*****************************************************************************
追記 20150901 上記の設定で現在のところエラーログも出ずに安定稼動しております。
**********************
参考までに現在のサーバ環境
centos6
メモリ 1 GB
ディスク HDD 100 GB
CPU 2コア
wordpress+apache+mysqlなどなど
基本的なブログサーバです