# メモリアロケータ ## 定義 メモリアロケータは、仮想アドレス空間内での実際のメモリのアロケーションと配置を担うユーザーランドライブラリまたはカーネルベースルーチンで、malloc(3)/free(3)のような簡単なインターフェイスをソフトウェア開発者に提供する。アロケータの性能はメモリ使用の効率化(フラグメンテーション対策)、パフォーマンス(ロック競合の削減、スレッド/CPUごとのキャッシュ活用)、可観測性(統計量・デバッグモード)によって左右される。 Linuxはページ管理にバディアロケータを使う。これはページサイズの2の累乗倍になるメモリアロケーションのために複数のフリーリストを管理し、ノード(NUMA)→ゾーン(DMA/通常/ハイメモリ)→マイグレーションタイプ→サイズという階層構造を持つ。カーネルのスラブ(slab)アロケータは特定サイズのオブジェクトのキャッシュを管理し、ページアロケーションのオーバーヘッドなしで高速にリサイクルする。もとはSolaris 2.4向けに開発され、CPUごとのマガジンキャッシュに拡張された。Linuxでは2.2で導入されデフォルトだったが、その後SLUB(オブジェクトキューとCPUごとのキャッシュを廃してNUMA最適化をページアロケータに委ねる設計。Linux 2.6.23でデフォルト化)に置き換わった。 ユーザーレベルでは、glibc(ダグ・リーのdlmallocを基礎に、小さなアロケーションはメモリビン、大きなアロケーションはツリールックアップ、非常に大きなアロケーションはmmap(2)を使い分けるハイパフォーマンスアロケータ。malloc_trim(3)でフリーメモリをシステムに開放できる)、TCMalloc(スレッドごとのキャッシュでロック競合を削減し、定期的なガベージコレクションで中央ヒープにメモリを返す)、jemalloc(もとはFreeBSDのlibcアロケータ。マルチアリーナ・スレッドごとのキャッシング・小さなオブジェクトスラブでスケーラビリティを向上させフラグメンテーションを削減。Facebookが採用)がある。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.3.2.2, §7.3.3.1〜§7.3.3.2.5) ## 横断的知見 (このセクションは複数ソースの突き合わせで得られる知見を蓄積する。現時点では本概念に触れたソースが1件のため、蓄積を今後の ingest に委ねる。) ## 未解決の問い - スラブからSLUBへの移行でNUMA最適化がページアロケータ側に委ねられたことは、マルチソケットNUMAシステムでのカーネルオブジェクトアロケーションのレイテンシにどの程度の実測差を生むか。 - jemalloc/TCMalloc/glibcのどれを選ぶかは、AI推論サーバーのような大量の小さなテンソルバッファをアロケートするワークロードでフラグメンテーションとスループットにどのような差を生むか、定量比較はあるか。 - glibcのmalloc_trim(3)によるヒープ縮小(M_TRIM_THRESHOLDデフォルト128KB)は、ヒープの成長とメモリリークの誤認を減らす手がかりとしてどこまで使えるか。 ## 関連 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] — 本概念の原典解説(図7-11)。 - [[Linuxメモリ回収]] — リーピングが開放するスラブキャッシュとの関係。 - [[詳解 システム・パフォーマンス 第2版]] — 書籍ハブ。 ## 出典 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.3.2.2, §7.3.3.1〜§7.3.3.2.5