お世話になります。

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になっているメモリを開放する方法はあるのでしょうか?

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


よろしくお願いします。

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qfreeコマンドのfree,swapについて

Linuxカーネル本では、回収アルゴリズムはメモリが少なくなったら動作すると記載がありますが、
24時間運転のJavaアプリが動作している環境で、freeコマンドfree容量、swap容量は
毎日増え続けています。

1.freeコマンドのfree容量、swap容量の開放タイミングはいつかを教えてください。

2.24時間運転のような、再起動のタイミングが無い場合、freeコマンドのfree,swapはどういう場合、 
 回収動作が実行されるか、free,swapの値は増え続けて問題は無いでしょうか。

3.メモリはどんどん使っていって、少なくなったら回収する時の閾値設定は何になるのでしょうか?

 例:/proc/~ の・・・の値を超えた場合、swapの回収を行う。

よろしくお願いいたします。

Aベストアンサー

実メモリの話と仮想メモリ量の話を混同されていますね。

書籍から引用された部分は、実メモリの空きページ(free)が足りなくなった場合に、プログラムにより使われている(usedからbuffersとcachedを引いたもの)が最近参照されていない実メモリをswapに一時的に待避させたり、OSが割り当てるバッファ(buffers)やキャッシュ(cached)を減らしたりして、実メモリの空きページを作る話です。
(文中括弧内はfreeの表示項目名)

実メモリのfreeが減っていくのはお書きのようにいずれ何とかなりますので、心配の必要はありません。

swapの使用量が増え続けるというのは、プログラムで使っている仮想メモリ量が増え続けていると言うことで、これは、プログラムが仮想メモリを解放したり、そのプログラムが終了したりしない限り、減りません。

厳密に言うと、メモリリークじゃなくて、仕様かもしれません。例えば、メモリ上で扱うデータがどんどん増える一方だとか。その場合は、無限大サイズのswapエリアが要ります。まあ、その前にOSで扱える最大量を超えた時点で終わりますが。無限の仮想メモリを必要なプログラムというのは、仕様のバグですね。メモリリークとは呼びませんが。

実メモリの話と仮想メモリ量の話を混同されていますね。

書籍から引用された部分は、実メモリの空きページ(free)が足りなくなった場合に、プログラムにより使われている(usedからbuffersとcachedを引いたもの)が最近参照されていない実メモリをswapに一時的に待避させたり、OSが割り当てるバッファ(buffers)やキャッシュ(cached)を減らしたりして、実メモリの空きページを作る話です。
(文中括弧内はfreeの表示項目名)

実メモリのfreeが減っていくのはお書きのようにいずれ何とかなりますので、心配の必要はあ...続きを読む

QLinuxのswap領域と基本パーティションの数

宜しくお願い致します。

今回、Windows7とCentOSのデュアルブート環境を構築してみました。
使用しているPCは市販のノートPCなのですが、購入時に既に基本パーティションが3つ作られている状態でした。(1つのパーティションにはWindowsが入っていて、残り2つはリカバリー用)

今回、Windowsの入っていたパーティションを縮小して、新たに4つ目の基本パーティションを作り、そこへCentOSをインストールしました。
その際、swap領域を確保せずにインストールを行ってしまいました。

swap領域を確保したいのですが、既に基本パーティションが4つ埋まっている状態です。
基本パーティションは4つまでしか作成できないと理解しているのですが、今の状況からswap領域を確保することはできるでしょうか?

ご回答宜しくお願い致します。

Aベストアンサー

メモリ容量が十分であれば、そうそうスワップは使われないと思われますが…

それでもSwap領域が欲しい。
というのであれば、Swapファイルで対応してみてはどうでしょうか?
# パーティションは追加できないでしょうし。

http://linuxsalad.blogspot.com/2009/05/swap.html
ubuntuでの例ですが、CentOSでも変わらないでしょう。
# 他にも「Linux Swap ファイル」で検索すると見つかります。

QKnnopixのboot時に soft lockup detected on CPU#0! で起動できない

はじめまして,詳しい方教えて下さい.

knnopix5.0 CD を IBM Thinkpad R30 にセットし,
クノーピクスを使うべく起動しました.一番最初の
画面は表示され,Return keyを押して起動を進めた
のですが,『soft lockup detected on CPU#0!』
とダイアログが表示され,止まってしまいました.
何度やっても同じ状態で止まります.

解決方法をご存知でしたら,教えていただけない
でしょうか .よろしくお願いします.

Aベストアンサー

参考までに
R40では V5.0.1 20060601-20060614+IPAFont_AC20060623.iso
はすんなり動きました。
スペック celeron 1.60GHz 640MB

Qtopコマンドで表示されるVIRT、RESおよびSWAPの意味について

topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。
CentOS5.4上で動作しているアプリケーションの使用メモリについて調査しています。
サーバのメモリ容量は512MBで、この上でスワップアウトしないようにアプリケーションの起動数(常駐)を調整しようとしています。

topコマンドでプロセスが使用している物理メモリ容量はRES項目を見れば良いことがわかっていますが、VIRT(仮想メモリの総量)とSWAP(スワップされたサイズ)が具体的に何を示しているのかがわからず、困っています。

topコマンドの出力結果は下の通りです。
この検証用サーバでは暫定的にパーティション設定でスワップ領域を作成していません。
しかしtopコマンドではVIRTとRESの数値は差異があり、SWAP項目も大きな値を示しているプロセスがあります。

スワップ領域が無いのではtopコマンドはVIRTとRESが同じになり、SWAPはゼロとなると予想していたのですがどうしてならないのですか?

top - 03:35:44 up 36 min, 3 users, load average: 0.13, 0.17, 0.20
Tasks: 90 total,  1 running, 89 sleeping,  0 stopped,  0 zombie
Cpu(s): 0.0%us, 1.3%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st
Mem:  515340k total,  452152k used,  63188k free,  18132k buffers
Swap:    0k total,    0k used,    0k free,  347404k cached

 PID USER    PR NI VIRT RES SHR S %CPU %MEM  TIME+ SWAP COMMAND
 4602 tomcat  25  0 645m 28m 6996 S 0.0 5.8  0:04.12 616m java
 2227 root   34  19 25656 10m 2108 S 0.0 2.0  0:00.12 14m yum-updatesd
 1680 root   17  0 11580 9964 240 S 0.0 1.9  0:00.02 1616 restorecond
 1936 haldaemo 18  0 5472 3676 1688 S 0.0 0.7  0:01.20 1796 hald
 2499 root   18  0 10540 2916 1504 S 0.0 0.6  0:00.03 7624 httpd
 3672 root   15  0 10064 2888 2308 S 0.7 0.6  0:02.50 7176 sshd
 3927 root   20  0 9916 2880 2308 S 0.0 0.6  0:00.34 7036 sshd
 2054 root   18  0 10116 2328 1696 S 0.0 0.5  0:00.04 7788 cupsd
 2500 apache  25  0 10540 2088 640 S 0.0 0.4  0:00.00 8452 httpd

どうしてもズレるので画像を添付してます。

topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。
CentOS5.4上で動作しているアプリケーションの使用メモリについて調査しています。
サーバのメモリ容量は512MBで、この上でスワップアウトしないようにアプリケーションの起動数(常駐)を調整しようとしています。

topコマンドでプロセスが使用している物理メモリ容量はRES項目を見れば良いことがわかっていますが、VIRT(仮想メモリの総量)とSWAP(スワップされたサイズ)が具体的に何を示しているのかがわからず、困っています。
...続きを読む

Aベストアンサー

答えにたどり着く前に、若干長めの説明が必要です。

> topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。

 RESは、ご認識の通り、そのプロセスの物理メモリ使用量です。

 VIRTとして表示されている仮想メモリ総量とは、そのプロセスの
仮想アドレス空間の中で、有効となっているページの総量です。
これに計上されるのは、参考リンクの「仮想記憶の概念図」でカラフルに
描かれている「物理メモリ」や「スワップ」に対応するページのほか、
以下のようなものも含まれます。

・プロセスが確保したメモリのうち、まだ一回もアクセスして
 いない部分。
  ⇒アクセスしたときに初めて物理メモリが割り当てられ、
   RESにも計上されていきます。
  (javaのRESに比べてかなり大きいVIRTは、これによるものと
   思われます。大きなヒープサイズを指定していませんか?)

・プロセスが ファイルを仮想メモリ空間にmmap(2) したが、
 まだ一回もアクセスしていない部分。
  ⇒Linux(UNIX) には、あたかもメモリをアクセスするかのように
   ファイルを読み書きできる mmap(2) という機能があり、
   かなり多用されています。mmap直後のファイルは、
   VIRTには計上されますが、物理メモリには読み込まれずRESには計上
   されません。ファイルをmmapした仮想メモリ空間にアクセスした
   部分が、物理メモリに読み込まれRESに計上されます。

> スワップ領域が無いのではtopコマンドはVIRTとRESが同じになり、
> SWAPはゼロとなると予想していたのですがどうしてならないのですか?

実は、SWAPとして表示される数値は、単に VIRT と RES の差です。

VERT(仮想メモリ総量)の中には、物理メモリ(RES)やスワップ領域の
使用量だけなく上記で挙げたような仮想空間の部分の合計が含まれ
ますから、スワップ領域がゼロでも、上記で挙げたような空間が
SWAP として表れているのです。

個人的にはこの数値をSWAPと呼ぶのは、かなり不適切だと思いますが、
多くのLinuxディストリビューションのtopコマンドで表示される
SWAP欄は、そういう計算をしているということです。

参考URL:http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6

答えにたどり着く前に、若干長めの説明が必要です。

> topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。

 RESは、ご認識の通り、そのプロセスの物理メモリ使用量です。

 VIRTとして表示されている仮想メモリ総量とは、そのプロセスの
仮想アドレス空間の中で、有効となっているページの総量です。
これに計上されるのは、参考リンクの「仮想記憶の概念図」でカラフルに
描かれている「物理メモリ」や「スワップ」に対応するページのほか、
以下のようなものも含まれます...続きを読む

Qファイル名に#***#

削除できないファイルがあるので質問します。

対話ウィンドウ(X11)で ls ~ を入力すると
PicturesやDocumentsなどのディレクトリの他に、
#sample1.c# や #mail*#....# のように
シャープで挟まれたファイルが存在します。
rm や rmdir 、cat、more、などのコマンドで反応しません。
どうしてこのようなファイルができ、またなぜ削除できないのかわかりません。
プログラム作成を目的にEmacsに作成し、またコンパイル、削除を繰り返すうちに出現しました。

このファイルがどのようなものなのか、また削除するにはどうしたら良いかなど教えてください。
初心者なので不明な点もあるかと思いますが、宜しくお願いします。

Aベストアンサー

emacsの自動リカバリ用(編集中にemacsが終了した場合などにそのファイルを復元するため)のファイルですね。

# はシェルのコメント記号なので、
rm "#sample1.c#" などのように " や ' で囲むとよいでしょう。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報