m-fujii
2014年7月18日 14時41分
藤井と申します。
Armadillo-440を使用していて、
自作したアプリケーションプログラムが使用するメモリ(malloc や vecotr等)確保の際に、
メモリ不足になった時のテストをしたいのですが、物理メモリの量を設定で減らす事は出来ますでしょうか?
現状、128MBのRAMに対して、20MBにするとか。
Armadillo-840では、「Linuxカーネルが利用可能なメモリを384MByteに制限します」などの記述があるようですが。
ちなみに、別プログラムで、無駄に110MB(malloc出来るサイズのほぼ上限)のメモリをmallocした状態にして、
テスト対象のプログラムを起動しても、メモリ不足になりませんでした。
こちらは、シロート考えで、別プログラムがメモリを消費しておけば、テストできるかと思いましたが、
思ったようにはなりませんでした。(freeコマンドで確認しても110MBを消費しているようにならない。)
よろしくお願い致します。
コメント
at_ohsawa
yanagihara
こんにちは、柳原と申します。
私も似たような疑問を持った事があったのですが、
・over commit
・OOM killer
についても調べておくと良いと思いますよ。
とっかかりは以下のサイトあたりで。
http://passingloop.tumblr.com/post/11957331420/overcommit-and-oom-killer
m-fujii
作成者の藤井です。
中山様、at_ohsawa様、柳原様
アドバイスありがとうございます。
先ずmallocの方ですが、ご助言通りmemset()の処理を追加した所、メモリを消費する様になりました。
次にsetenvの方ですが、こちらもご助言通り設定出来ました。
2つの施策を組み合わせる事で、対象プログラムのメモリ不足のテストができました。
今のところ、fork や pthread_create のCallで失敗(Cannot allocate memory)しています。
と、テストしていましたら、柳原様の情報のOOM killerが発生しました。
こちらにつきましては、ご紹介して頂いたサイトを参考に、対策を検討していこうと思います。
皆様、ありがとうございました。
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()でメモリアクセスの機会を発生させています。