[Armadillo:04914] Re: 連続運用に残メモリ監視が必要でしょうか

Yasushi SHOJI email@hidden
2010年 1月 25日 (月) 09:27:10 JST


At Fri, 22 Jan 2010 18:52:49 +0900,
小谷 wrote:
> 
> freeコマンドで残メモリが減っているように見える件
> http://lists.atmark-techno.com/pipermail/armadillo/2008-February/002786.html
> 
> 220で連続運用試験をしております。意図的に別プロセスで圧迫して
> 残り1000ブロックを切ったあたりからあまり減らなくなったように見えるのですが、
> カーネルが開放を始める閾値のようなものがわかりますと助かります。

圧迫しているプロセスが動き続けているのに「意図的に圧迫しても、残メモリ
の減り具合が止まる」ということでしょうか?

もし正常に圧迫しているのであれば、カーネルが使うメモリが無くなり、その
うちOOM(Out of Memory) Killerが発動しプロセスが終了すると思いますが、違
う挙動をしていますか?

http://linux-mm.org/OOM

Linuxのように、MMUを使ったシステムの場合 malloc()しているだけでは、実際
の物理メモリを消費しません。CoW(Copy on Write)の機能により、書き込まれる
までは、仮想的なメモリが配置されるだけですので、気をつけてください。

> ユーザーアプリの使用メモリは全くリークなどありません
> freeコマンドの出力では残りがゆっくり減っていくように見えるのが心配なため
> 念のため残メモリを監視しリブートをかけるプロセスを動かしています。

アプリケーションが malloc()したメモリを free()しても、完全にシステム側
へ開放されることはありません。これは、heap baseの malloc()の制限です。

http://en.wikipedia.org/wiki/Malloc#Heap-based
http://www.gnu.org/s/libc/manual/html_node/Freeing-after-Malloc.html

アプリが終了しているにもかかわらず、システムの空メモリが増えない場合は、
システムがキャッシュに使用している可能性があります。

	/proc/sys/vm/drop_caches

を使うことで、キャッシュをクリアすることができます。
また、

	/proc/meminfo

を見ることで、現在の状態を把握することができます。

http://linux-mm.org/Drop_Caches
http://linux-mm.org/Low_On_Memory

ただ、これも完全に開放できるわではありません。

> ですが、リブートは本意ではなく、
> ユーザーアプリのリークはないことがはっきりしていますので、
> 監視を止めるか、カーネルが開放を始める値の下に閾値を設けたいと考えていま
> す。

カーネルは、drop_cachesを使って明示的に開放させないかぎり、キャッシュし
ているメモリを開放することはありません。これは、low on memoryのページも
ありますが、Linuxの考えとして

	Linux has this basic rule: a page of free RAM is wasted RAM.

があるからです。

Linuxカーネルに完全にバグがないとは言いえませんので、長期稼動の前には十
分なテストをお願いします。
-- 
           yashi



armadillo メーリングリストの案内