by shigemk2

当面は技術的なことしか書かない

進撃のmalloc #kernelvm

malloc - Wikipedia

ガチャピン先生

進撃のmallocってなんだ

gblicのmalloc近辺の開発にかかわる

  • MM Summit
  • Ruby core commiter(コミット率TOP10コミッタ)

@kosaki55tea

LKMLでのdisりあい 殴り合い

ebizzy download | SourceForge.net

N個のスレッドがs病の間に何回malloc memcpy freeが出来るかを測定

カーネルでは時間をあまり食ってない

mallocバグ知識

2行消したら20倍高速化

Linuxキーワード - glibc:ITpro

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は徐々にこちらに置き換えられる?