Armadilloフォーラム

Armadillo-440 で、Linuxカーネルが利用可能なメモリを制限できますか?

m-fujii

2014年7月18日 14時41分

藤井と申します。

Armadillo-440を使用していて、
自作したアプリケーションプログラムが使用するメモリ(malloc や vecotr等)確保の際に、
メモリ不足になった時のテストをしたいのですが、物理メモリの量を設定で減らす事は出来ますでしょうか?

現状、128MBのRAMに対して、20MBにするとか。
Armadillo-840では、「Linuxカーネルが利用可能なメモリを384MByteに制限します」などの記述があるようですが。

ちなみに、別プログラムで、無駄に110MB(malloc出来るサイズのほぼ上限)のメモリをmallocした状態にして、
テスト対象のプログラムを起動しても、メモリ不足になりませんでした。
こちらは、シロート考えで、別プログラムがメモリを消費しておけば、テストできるかと思いましたが、
思ったようにはなりませんでした。(freeコマンドで確認しても110MBを消費しているようにならない。)

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

コメント

nakayama.junichi

2014年7月18日 14時54分

藤井様

中山と申します。

> ちなみに、別プログラムで、無駄に110MB(malloc出来るサイズのほぼ上限)のメモリをmallocした状態にして、
> テスト対象のプログラムを起動しても、メモリ不足になりませんでした。
> こちらは、シロート考えで、別プログラムがメモリを消費しておけば、テストできるかと思いましたが、
> 思ったようにはなりませんでした。(freeコマンドで確認しても110MBを消費しているようにならない。)

ネットで調べてみました。
http://stackoverflow.com/questions/1865501/c-program-on-linux-to-exhaus…

上記ページによると、
メモリにアクセスしないと、メモリが実際には消費されないようです。
10番の回答のサンプルコードを参考にしてみてください。
memset()でメモリアクセスの機会を発生させています。

at_ohsawa

2014年7月18日 15時06分

JP2をショートさせて電源を投入して保守モードから、
setenv に mem=50M のように起動パラメーターを渡すと、
Linuxから見えるメモリの量を制限できます。

起動ログの出力先の設定も忘れずに書いてください。

hermit> setenv console=ttymxc1,115200  mem=50M

少な過ぎると、ブートしている最中にメモリが不足して
起動に失敗します。

yanagihara

2014年7月18日 16時50分

こんにちは、柳原と申します。

私も似たような疑問を持った事があったのですが、
 ・over commit
 ・OOM killer
についても調べておくと良いと思いますよ。

とっかかりは以下のサイトあたりで。
http://passingloop.tumblr.com/post/11957331420/overcommit-and-oom-killer

m-fujii

2014年7月18日 18時48分

作成者の藤井です。

中山様、at_ohsawa様、柳原様
アドバイスありがとうございます。

先ずmallocの方ですが、ご助言通りmemset()の処理を追加した所、メモリを消費する様になりました。
次にsetenvの方ですが、こちらもご助言通り設定出来ました。

2つの施策を組み合わせる事で、対象プログラムのメモリ不足のテストができました。
今のところ、fork や pthread_create のCallで失敗(Cannot allocate memory)しています。

と、テストしていましたら、柳原様の情報のOOM killerが発生しました。
こちらにつきましては、ご紹介して頂いたサイトを参考に、対策を検討していこうと思います。

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