malloc(3)のチューニング

カツオ茶漬

malloc(3)のチューニング方法はちょっと変っていて、mallocの設定内容をリンク先したシンボリックリンクを/etc/malloc.confに作成する(環境変数でも同じ設定ができるけど)。

$ man 3 malloc
...
FILES
     /etc/malloc.conf  symbolic link to filename containing option flags

EXAMPLES
     To set a systemwide reduction of cache size, and to dump core whenever a
     problem occurs:

           ln -s 'A<' /etc/malloc.conf

     To specify in the source that a program does no return value checking on
     calls to these functions:

           extern char *malloc_options;
           malloc_options = "X";

...

mallocソースコードはこんな感じ。

/usr/src/lib/libc/stdlib/malloc.c
...
438     for (i = 0; i < 3; i++) {
439         if (i == 0) {
440             errnosave = errno;
441             j = readlink("/etc/malloc.conf", b, sizeof b - 1);
442             errno = errnosave;
443             if (j <= 0)
444                 continue;
445             b[j] = '\0';
446             p = b;
447         } else if (i == 1) {
448             p = getenv("MALLOC_OPTIONS");
449         } else {
450             p = malloc_options;
451         }
452         for (; p != NULL && *p != '\0'; p++) {
453             switch (*p) {
454                 case '>': malloc_cache   <<= 1; break;
455                 case '<': malloc_cache   >>= 1; break;
456                 case 'a': malloc_abort   = 0; break;
457                 case 'A': malloc_abort   = 1; break;
458                 case 'h': malloc_hint    = 0; break;
...

おお、readlink(2)一発で読めるのか。普通にファイルを読むのに比べると随分簡単だ。どうせ環境変数と設定の記述フォーマットが同じで単純なんだし、これはこれでシンプルでいい。