Fork me on GitHub

cuspy memo


MALLOC_MMAP_THRESHOLD_ と MALLOC_MMAP_MAX_

2010/02/22 Monday 03:50:51

malloc(3) を呼んだ時、glibc はヒープ領域から指定したサイズのチャンクを確保するが、ヒープ領域が足りなかった場合 glibc は brk(2) を呼んでヒープ領域を拡張するか、Anonymous Memory と呼ばれる領域を mmap(2) して新たなヒープ領域を作成する。

この動作を制御する環境変数が MALLOC_MMAP_THRESHOLD_ らしいのでこれを試しているのだけれど、効かなくて困った。

しかたがないので glibc のソースを読んでいると mmap(2) を使用する最大サイズを指定する MALLOC_MMAP_MAX_ というのも見つけた、これはばっちり効いたのでこれを使おう。

1M を 3回 malloc するだけのコード

#include <stdio .h>
#include <stdlib .h>

int main(){
    int i;
    for(i=0;i<3;i++){
        malloc(1*1024*1024);
    }
    return 0;
}
% strace ./a.out
(略)
mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7c9b000
mmap2(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7a9a000
mmap2(NULL, 3149824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7799000

デフォルトではこんな風に、3回 mmap(2) が呼ばれる。
MALLOC_MMAP_MAX_=0 にすると、

% strace env MALLOC_MMAP_MAX_=0 ./a.out
(略)
brk(0)                                  = 0x8efa000
brk(0x901b000)                          = 0x901b000
brk(0x911b000)                          = 0x911b000
brk(0x921b000)                          = 0x921b000

4回 brk(2) を呼ぶようになった。
MALLOC_MMAP_MAX_=1 にすると、

% strace env MALLOC_MMAP_MAX_=1 ./a.out
(略)
mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7cfe000
brk(0)                                  = 0x94bc000
brk(0x95dd000)                          = 0x95dd000
brk(0x96dd000)                          = 0x96dd000

最初の malloc(3) だけ mmap(2) するようになった。
単位はMbyte なのね。(MALLOC_TRIM_THRESHOLD_の単位は byte だったのに・・・)

これで完全に malloc(3) の中で mmap(2) を呼ぶこと無いかというと、そういう訳でもなくて、特定の条件下で mmap(2) する場合ある様なので困ったのう。

No comments yet.

Leave a comment

You must be logged in to post a comment.

spamassassin と wanderlust

2010/02/13 Saturday 03:31:03

spamassassin で

rewrite_header Subject ***SPAM***

などとやっている場合の偽陽性なメールに対して返信する時に

Re: ***SPAM*** ほにゃららについて

って件名のメールを送ってしまうのは失礼ではないか。
ということで、追加した wanderlust 向け elisp

(add-hook 'wl-draft-reply-hook
          (function
           (lambda ()
             (save-excursion
               (beginning-of-buffer)
               (re-search-forward "^Subject: " (point-max) t)
               (while (re-search-forward
                       "\\*\\*\\*\\(SPAM\\|UNCHECKED\\)\\*\\*\\* *"
                       (save-excursion (end-of-line) (point)) t)
                 (replace-match ""))
               ))))

No comments yet.

Leave a comment

You must be logged in to post a comment.

20100123 simple

2010/01/23 Saturday 17:39:23

今日やったこと。
erl_interface の perl XS module Erlang-Interface-0.03 リリース。
http://search.cpan.org/~hamano/Erlang-Interface-0.03/
github にも push
http://github.com/hamano/perl-erlang-interface

Cのerl_interface に対応する低位インターフェースは用意できた。
あとは上位にオブジェクトインターフェースを用意したいのだけどノードのインスタンスを複数作るにはどうしたものか。

これを実装するにあたりooldaemonさんの記事が参考になった。
erl_interface メモ – cooldaemonの備忘録

あと自宅サーバーを復旧した。
wordpress 2.9.1 に upgrade、壊れたDBを修復した。

firefox が落ちる問題の調査。
uim か gtk の immodule が怪しいことは解った。
滅多に再現しないので得に進展なし。

以上。

追記:
firefoxがクラッシュする問題は、uim 1.5.6 以前の問題で 1.5.7 以降で修正されていることを @mnoguさんに教えてもらった。
http://bugs.freedesktop.org/show_bug.cgi?id=25139

No comments yet.

Leave a comment

You must be logged in to post a comment.

野菜炒め

2010/01/18 Monday 03:14:16

yasai

No comments yet.

Leave a comment

You must be logged in to post a comment.

#include <beer.h>

2009/11/09 Monday 23:29:05

include_beer_h

No comments yet.

Leave a comment

You must be logged in to post a comment.

Next Page >