プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

CentOS6.4を使ってPHPアプリを動かしています。

結構メモリを消費するアプリなので、
使っているうちにOutOfMemoryになることがあります。
※正常終了する場合もあります。

正常に終了しようがOutOfMemoryになろうが、
大量にメモリを確保した後は、そのまま解放されていないように見えます。

例えば、freeコマンドで見たときにに usedが減りません。


【例】
アプリケーション実行前
# apachectl restart

# free
total used free shared buffers cached
Mem: 16334660 472788 15861872 0 105700 120124
-/+ buffers/cache: 246964 16087696
Swap: 2047992 0 2047992

ここでアプリケーション実行し正常に終了。

# free
total used free shared buffers cached
Mem: 16334660 1754276 14580384 0 106836 120484
-/+ buffers/cache: 1526956 14807704
Swap: 2047992 0 2047992


apacheを再起動すればusedは減るのですが、
他にusedになっているメモリを開放する方法はあるのでしょうか?

また、どのようなメカニズムで解放されないのか教えていただけるとありがたいです。


よろしくお願いします。

A 回答 (4件)

>apacheを再起動すればusedは減るのですが、


>他にusedになっているメモリを開放する方法はあるのでしょうか?

ないです。

>また、どのようなメカニズムで解放されないのか教えていただけるとありがたいです。

多くの場合、プログラムがOSから借り受けたメモリはプログラムが終了するまでOSには返さず、
再度必要になったときのために備えておきます。

この回答への補足

そうですね。

OutOfMemoryで異常終了したときにメモリが解放されないという点についてはご説明のとおりで納得なのですが、正常終了しているケースでも解放されないとい点で、疑問を感じたものですから質問を投稿しました。

補足日時:2014/07/04 09:10
    • good
    • 1
この回答へのお礼

ありがとうございまいした。

お礼日時:2014/07/04 09:10

>OutOfMemoryで異常終了したときにメモリが解放されないという点についてはご説明のとおりで納得なのですが、正常終了しているケースでも解放されないとい点で、疑問を感じたものですから質問を投稿しました。



私が#2で書いた「プログラムの終了」というのは、今回の件でいえばphpモジュールを組み込んでいるapacheの事です。
あなたのいう「phpアプリ」の事ではないです。
phpアプリを動かしているプログラムといえばわかります?

この回答への補足

理解しました。

ついでに言えば、前回のご回答がヒントになりました。

apacheのMPM関係のパラメータをデフォルトにしていたのですが、apacheのプロセスが残る場合があるようですね。

現在は以下のとおり極端に小さい値で試行していますが、、
とりあえずメモリは解放されるようになりました。


<IfModule prefork.c>
StartServers 1
MinSpareServers 1
MaxSpareServers 1
ServerLimit 1
MaxClients 1
MaxRequestsPerChild 1
</ifModule>

補足日時:2014/07/07 11:48
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2014/07/07 11:48

Linuxでは空きメモリをページキャッシュに使用します。



ページキャッシュとは、ファイルI/O を高速に行うため、最近参照
したファイルの内容のメモリ上へのキャッシュです。ページキャッ
シュはメモリ領域を専有しますが、他でメモリ必要になった場合は
開放される領域なので、空き領域として計上することができます。

ですから、厳密ではありませんが、freeを使ってメモリ使用量を算
出したい場合は、usedではなく、total - free - buffers - cached
で算出する必要があります。

ところで下記で強制的にページキャッシュを開放できますが、通常
はこれをやるメリットはありません。

# echo 1 > /proc/sys/vm/drop_caches

この回答への補足

なるほどです。

たしかに
-/+ buffers/cache: 1527988 14806672
となっていますね。

また、教えていただいた方法でページキャッシュを開放してみましたが、
元のキャッシュ容量が大きくないので、
格段に空きが増えるわけではないですね。

補足日時:2014/07/04 08:55
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2014/07/04 08:55

PHPはapacheのモジュールでうごいているのでしょうか?



またtopで観察していても変化はないでしょうか?

この回答への補足

PHPはモジュール版です。

LoadModule php5_module modules/libphp5.so


topで見ていても変化はありません。

質問の投稿から1時間経過しても以下のとおりです。

top - 14:09:42 up 22:25, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 126 total, 1 running, 125 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16334660k total, 1756508k used, 14578152k free, 108768k buffers
Swap: 2047992k total, 0k used, 2047992k free, 120696k cached

補足日時:2014/07/03 14:16
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

お礼日時:2014/07/03 14:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!