ガチャピン先生
進撃のmallocってなんだ
gblicのmalloc近辺の開発にかかわる
- MM Summit
- Ruby core commiter(コミット率TOP10コミッタ)
@kosaki55tea
LKMLでのdisりあい 殴り合い
ebizzy download | SourceForge.net
N個のスレッドがs病の間に何回malloc memcpy freeが出来るかを測定
カーネルでは時間をあまり食ってない
mallocバグ知識
2行消したら20倍高速化
1スレッド 1アリーナ(ヒープの中のサブヒープみたいなもの)に収束するように動く
諸般の事情でmain arenaとそれ以外とで動きが違う
いつKernelにメモリを変革するかのポリシーもその一つ
malloc(3)のメモリ管理構造 | VA Linux Systems Japan株式会社
これらメモリプールとメモリプール管理部をひとつのまとまりとした管理単位をmalloc()ではアリーナ(arena)と呼びます
考察
- memcpyが書いているからといってアプリが時間を食ってるというのは間違い
- Glibcはスレッドが4K以上freeするとほぼ毎回madviseでメモリ返却するので超遅い
- Glibcはmadviseが超高速と仮定しているけど、それは間違い
madvise
- POSIX的にはメモリを回収されやすくするようにプライオリティを調整するアドバイス
- Linuxではなぜかその場で解放されてしまう
- それだけではなく、mappingのinvalidate保証するためにその場でTLB shootdownで全CPUにIPI飛ばし、かつ全CPUから返事車でとまる
- 一回メモリ解放しちゃうと次回ページフォルトで同期的にpage zeroing始めちゃう
- zero page daemonがいない(全部ページフォルトが遅くなる)
DONTNEED sucks
- カーネルはDONTNEEDされた領域は99.9%二度と使われないと思っている
- free(3)されたメモリは99.9%再利用される semantic gap
- Glibcのヒストリを調べるのはすごくコツがいる
結論
- Glicはクソ
- Kernelもクソ
- jemallocいいよ
その後の展開
- BSDにはmadviseというアドバイスがある
- kernelにいつ解放してもいいよとアドバイスしてくれる
- ほぼfree(3)から使うの専用
- メモリは解放されるかもしれない、されないかもしれない
- Free済メモリをスワップアウトすると最高に馬鹿らしい
スワップアウトとは|ページアウト|swap-out - 意味/解説/説明/定義 : IT用語辞典
- LSFMMM14で「ただ捨てる」挙動にするように同意がとれた
The direction of malloc
vrange
LKML: John Stultz: [PATCH 5/8] vrange: Add new vrange(2) system call
malloc_set_state
Emacs専用 API→「要らない」
malloc_set_stateの実装。mallocなんてないから置き換え不可能なんじゃね?という嫌疑が提出される
libcに変える自由
signal-safe malloc replacement
- signal_safe_memalign, signal_safe_free
メモリ確保関数をもう1セット実装 async-signal-safe関数からのmallocは徐々にこちらに置き換えられる?