[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:21938] Re: 物理メモリサイズを取得する方法を教えて下さい



岩佐です。

Shun-ichi TAHARA (田原 俊一) <jado@flowernet.gr.jp> wrote:

> # 仕事では、4GB のマシンで malloc() failed を出したりします :-)。

  ぼくは最近、AMD64マシンがとっても欲しいです(^_^;

> >   そもそも、「実際に取ってみる」ってどうなのでしょう?
> 
> というわけで、裏でカーネルがこれだけの仕事をやっている以上、「実際に取っ
> てみる」というのは、「とりあえず実メモリをかき集めてきて mmap か heap
> に貼り付ける」というだけの話なので、何ら意味はないことになりますよね。
> 
> もっとも、経験上、malloc() 1回で取れるメモリブロックは、とりあえず全部
> 実メモリに載っていて、かつ、物理アドレスとして連続しているんじゃないか、
> と思っています(嘘かも)。

  あれれ? そんなことは無いような気が。

  の前に、まず、ぼくが書いた「実際に取ってみる」は、「取って
みることによって実メモリの利用可能量を調べる」こと(が出来る
こと)が前提ですから、mlockall()したような場合についてです。
  仮にmlockallしたとしても... ということを先に書いたのですが、
わかりづらかったかもしれません。ごめんなさい。
  なので、噛みあっていないだけかもしれません...


  で、linuxのmallocは、実メモリより大きなサイズがalloc出来ま
すよ。
    #  overcommit_memory == 0でも、です。
  例えば、実memory 1G, swap 2Gのホストで、

|    void * k;
|
|    k = malloc(1024 * 1024 * 1500);
|    if(k == NULL)
|    {
|        printf("error");
|    }
|    else
|    {
|        printf("success");
|    }

なんて書くと、ちゃんとsuccessします。
    #  と言うのがなぜか、というのが、元質問者の方の
    # 疑問だと思います。


  ぼくはBSD方面の古い理解しかないのでアレですが、別段、物理
メモリ的に全体が連続である必要はないのでありません?
  pageレベルでは連続でしょうけど。

> あー、これはいいですね。あいかわらずスワップはメモリを圧迫してくれます
> けど。あと、malloc するのであれば、128KB 以上のブロックでとってあげた
> 方がいいです。このへんは、mmap と heap の使い方の癖に関わってくるんで
> すが。

> これも、1GB の壁に当たってるように見えるので、その問題に関係してるんじゃ
> ないかなぁ。ようするに、text+heap はメモリマップ上で 1G 分に制限されて
> て、128KB 未満の malloc() はこちらからしか取らないのです。
> 
> 大きいブロックは、その上の mmap + スタックの領域(2G)から取ってきます。
> これが溢れると heap も使いますので、「取れるだけ取る」のであれば、
> 128KB でぎっていくのが正解。

  テストコードは、1M mallocして、freeして、2M mallocしてfree
して... をずっと続けるコードでした。それが、mlockall(FUTURE)
をかけたまま973Mを一気にmallocしようとしたところで、各process
がkernelにKILLされた、という話です。

  起きたのは、

    - 物理メモリのほとんどを(mlockallによって)テストプロ
     グラムに占有されたがために、各processがどんどんswapout
     した。

    - swapoutしたprocessが動こうとして、__alloc_pagesしよう
     としたが、それも出来なかった。

    - なので、そのprocessにSIGKILLが与えられた。

ということだと思います。
  ですから、落ちたのはメールに書いた通り、

| をいれて、RAM 1024M, SWAP 2GのPCで実行してみたところ、973Mま
| で行ったところで、daemonやらktermやらが落ちまくってしまい、
                   ^^^^^^^^^^^^^^^^^
無実のprocessです。
    #  terminalが落ちたので、SIGPIPEを頂いたかも。
    #    > テストプログラム

--- Think Diffident ----------------------------------------
                                                  uaitne.
   

Follow-Ups
[plamo:22012] Re: 物理メモリサイズを取得する方法を教えて下さい, H.Shiozaki
References
[plamo:21933] 物理メモリサイズを取得する方法を教えて下さい, H.Shiozaki
[plamo:21934] Re: 物理メモリサイズを取得する方法を教えて下さい, Iwasa Dai
[plamo:21935] Re: 物理メモリサイズを取得する方法を教えて下さい, Shun-ichi TAHARA (田原 俊一)

[検索ページ] [メール一覧]
Plamo ML 公開システム