Apacheによるメモリー負荷増大

nagiosがMemoryFree15%ほどと言うアラートが出ていたので確認。

# vmstat
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 404752 8112 18464 49092 0 0 32 14 0 1 7 10 82 1 0

まずはキャッシュを解放してみる。

# echo 1 > /proc/sys/vm/drop_caches
# vmstat
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 404752 56188 136 18896 0 0 32 14 0 1 7 10 82 1 0

いくらか良くなったが解決には至らず。
色々調べつつtopで見たところ。

 load average: 0.02, 0.03, 0.00
Tasks: 212 total, 1 running, 211 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.8%us, 9.9%sy, 0.2%ni, 82.2%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 506808k total, 458820k used, 47988k free, 1312k buffers
Swap: 1015800k total, 404584k used, 611216k free, 25564k cached>


そしてメモリを使ってるプロセスを調べるためps

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 2156 536 ? Ss 2009 9:04 init [3]
root 2 0.0 0.0 0 0 ? S< 2009 0:00 [migration/0]
root 3 0.0 0.0 0 0 ? SN 2009 0:02 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S< 2009 0:00 [watchdog/0]
root 5 0.0 0.0 0 0 ? S< 2009 0:01 [events/0]
root 6 0.0 0.0 0 0 ? S< 2009 0:00 [khelper]
root 7 0.0 0.0 0 0 ? S< 2009 0:43 [kthread]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apache 9035 0.0 5.8 80864 29660 ? S 08:03 0:05 /usr/sbin/httpd
apache 9168 0.0 4.0 72784 20628 ? S 08:14 0:03 /usr/sbin/httpd
apache 9172 0.0 4.0 72728 20636 ? S 08:14 0:02 /usr/sbin/httpd
apache 9173 0.0 2.8 72016 14472 ? S 08:14 0:01 /usr/sbin/httpd
apache 9174 0.0 4.0 72664 20564 ? S 08:14 0:02 /usr/sbin/httpd
apache 9175 0.0 3.9 72176 20188 ? S 08:14 0:01 /usr/sbin/httpd
apache 9176 0.0 3.9 71992 19896 ? S 08:14 0:01 /usr/sbin/httpd
apache 9177 0.0 3.9 71992 19896 ? S 08:14 0:01 /usr/sbin/httpd
root 9314 0.0 0.0 1756 392 ? Ss Jan04 0:00 /usr/sbin/acpid
apache 9615 0.0 2.2 84260 11192 ? S Feb01 0:39 /usr/sbin/httpd
apache 9616 0.0 5.0 83792 25724 ? S Feb01 0:36 /usr/sbin/httpd
apache 9617 0.0 5.6 83912 28604 ? S Feb01 0:41 /usr/sbin/httpd
apache 9618 0.0 6.0 83452 30856 ? S Feb01 0:36 /usr/sbin/httpd
apache 9619 0.0 5.7 84188 29320 ? S Feb01 0:39 /usr/sbin/httpd
apache 9620 0.0 5.1 83212 26132 ? S Feb01 0:44 /usr/sbin/httpd
apache 9621 0.0 6.0 84176 30580 ? S Feb01 0:39 /usr/sbin/httpd
apache 9622 0.0 4.9 84176 24916 ? S Feb01 0:40 /usr/sbin/httpd
apache 10656 0.0 5.7 84264 29372 ? S Feb01 0:47 /usr/sbin/httpd

・・・Apacheだけでどれだけメモリー喰ってるのかと・・・
そこで色々調べたところ、httpd.confでApacheのプロセスなどを制御できるらしい。
httpd.confをviで編集。

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

↑の箇所を初期設定値のまま使用し、xoopsやらWordPressを使ったことから負荷が増大したと思われる。
調べたところ
StartServers Apacheが起動時に立ち上がるプロセスの数。
MinSpareServers 動作するプロセスの最低数。
MaxSpareServers 動作するプロセスの最大数。
ServerLimit 設定可能なサーバプロセス数の上限 
MaxClients リクエストに応答するために作成される子プロセスの最大個数
MaxRequestsPerChild 一つのプロセスを受け付けるリクエストの最大数。
Apacheのログを見れば分かりますが、ページ内の画像ファイル一つ一つにリクエストが送られます。なので他サイトが画像ファイルを直リンクしたらページを読み込まなくても、画像ファイルを読み込むためにリクエストが送られその分負荷が増えることとなります。

それにCGIやPHPなどのファイルだと一度のリクエストでもプログラム処理のため負荷は増大しそうです。

なお調べた際には@IT:httpd.confによるWebサーバの最適化や『サーバ/インフラを支える技術
』を参考にしましたが、実際にはプロセス数から使用メモリーを割り出せる模様です。まだまだ勉強しなくては・・・

そして設定数値の見直し

<IfModule prefork.c>
StartServers       5
MinSpareServers    5
MaxSpareServers   10
ServerLimit      150
MaxClients       150
MaxRequestsPerChild  500
</IfModule>

そして設定ファイル読み込みと再起動。

# /etc/rc.d/init.d/httpd reload
httpd を再読み込み中:                                      [  OK  ]
# /etc/rc.d/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

そして

 load average: 0.08, 0.02, 0.01
Tasks: 199 total,   1 running, 198 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.7%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    506808k total,   182516k used,   324292k free,    38712k buffers
Swap:  1015800k total,   184912k used,   830888k free,    63040k cached

 

この辺りは今後も勉強したいところ。

[ad#ad_footer]