質問: ### 前提・実現したいこと ApacheにおいてPHPのメモリリークと思われる現象により、メモリが30分に2~3MB程度ずつ増加していっています。増加をとめるかApacheの全体メモリを1GB程度で抑えて正常稼動させたいと考えています。 ※本来はプログラムの修正を行うのが当然ですが ※担当部署が異なり緊急対応が必要な為難しい状態です。 質問は1点です。 1. 何か有効な対応策があればご教示下さい。 CronでのApache定期再起動は最終手段と考えています。 ### 発生している問題・エラーメッセージ ``` top - 15:45:21 up 77 days, 4:57, 1 user, load average: 1.66, 2.15, 2.01 Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie Cpu(s): 2.7%us, 3.1%sy, 0.0%ni, 93.6%id, 0.3%wa, 0.0%hi, 0.2%si, 0.1%st Mem: 5823320k total, 4310684k used, 1512636k free, 713208k buffers Swap: 2064380k total, 3156k used, 2061224k free, 883008k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 14511 webuser 20 0 1548m 1.1g 4444 S 8.3 19.7 0:00.27 httpd 14514 webuser 20 0 1548m 1.1g 5528 S 4.0 19.7 0:00.19 httpd 14547 webuser 20 0 1548m 1.1g 4736 S 1.3 19.7 0:00.06 httpd 14510 webuser 20 0 1548m 1.1g 5496 S 0.7 19.7 0:00.16 httpd ※Apache再起動直後のApache子プロセスの使用メモリは20MB前後 ※先日はSWAPが発生しPHPスクリプトの一部機能が動かず障害が発生 ``` ### 試したこと Apacheのコンフィグに MaxRequestsPerChild 30 を設定した結果、子プロセスはリクエストにより周期的に循環を行っているようですが、新しく生まれたApache子プロセスのVIRTとRESの値はリセットされず継承され現在も増加する不都合が起こっています。 現在のApache設定 StartServers 10 MinSpareServers 4 MaxSpareServers 20 ServerLimit 100 MaxClients 100 MaxRequestsPerChild 30 ### 補足情報(言語/FW/ツール等のバージョンなど) CentOS6.5 Apache2.2 PHP5.3.3 何卒宜しくお願いします。
回答: 現状でできそうなことといえば ・ServerLimit と MaxClients の値を50ぐらいに減らす ・大きなデータを扱う処理がないのであれば、php.ini の memory_limit を 8~16MBぐらいで設定する ・OS のメモリキャッシュをクリアする(http://futuremix.org/2009/09/clear-linux-memory-cach) ・Swap が少なすぎる気がするので、少なくても実メモリと同等ぐらいに拡張する でしょうか。 Swap は、RedHatの推奨として「8GB」程度のようですね。 https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/ch-swapspace.html