jemalloc とは
jemalloc は、標準ライブラリで定義されているmalloc, free 等のメモリアロケーション APIの実装である。
jemalloc : 公式ページ
jemalloc は2005年より、Jason Evans によって開発されており、SMPでのスケーラビリティのためにFreeBSD のlibcに取り込ま標準アロケータとなっている。
その他にも、Facebook の内部や、KVS のRedis、fluentd などにも取り込まれている。
具体的には、malloc(), calloc(), realloc(), posix_memaligne(), free() の実装を提供する。この他に、次に述べる特徴を持っている。
jemalloc の特徴
jemalloc の特徴は以下の3点である。
- マルチコア環境でのマルチスレッドプログラムのスケーラビリティを改善する
- メモリ領域で発生するフラグメンテーション(無駄な領域)を減らす
- メモリの使用にまつわる種々の問題を解決するための検査機構、ツールを提供する
マルチスレッドプログラムのスケーラビリティ
マルチスレッドプログラムでのスケーラビリティ改善について、jemallocでは以下のような施策を行っている。
- arena(1セットのメモリ領域)を複数保持する
- スレッドごとにThread Local Storage を用いてarenaとのヒモ付を行う
- arena、もしくはarenaの中のサイズクラスごとにLock を持つことでスレッド間の排他を削減する
この効果については、MySQLのベンチマークでGlibc mallocと、GoogleのTcmalloc、そしてjemalloc を比較した記事が参考になる。
MySQL performance: Impact of memory allocators (Part 2)
この記事では、おおよそ次のようなことが述べられている。
- glibc mallocとjemalloc、tcmallocをMySQLのベンチマークで比較
- コアとスレッドを変化させてパフォーマンス計測
- (スレッドの増加はは64でほぼサチる)
- jemallocとtcmallocはコアの増加でトランザクション数/秒をきっちりスケール
- tcmalloc とjemallocはほとんど同じ性能
- glibc mallocは8コア以上でロック競合のため性能が劣化している
- 結論:MySQLを使うサーバのコアが8よりも大きい場合はglibc 以外のアロケータを試す価値がある
jemalloc の作者であるJason Evans はglibc mallocは 6-8cpu で性能が劣化する(※)と過去に言っているが、上記実験結果はその傾向が現れているとも読める。
フラグメンテーションを削減する
jemalloc は、小さいサイズの割り当て要求のために、複数のsize class というものを用意している。割り当て要求は最も近いsize classにround up され、実際のメモリ領域が割り当てられる。この時、領域のフラグメンテーションを削減するために、roud up するサイズの最大値を要求サイズの25%以下になるようにしている。
具体的にはsize class は以下のようになっている。 8, 16, 32, ..(この間16づつ増加)... ,128, 160, 192, 224, 256, 320, ...
つまりサイズが増えるに従い、クラス間の増分を増やしている。例えば257byte の割り当て要求が来た場合、320byte にroud upされる。この時に無駄になる領域は63byte となり、これは257byte に対して約24.5 %となり、前述の25%以下に収まっていることがわかる。
しかし、glibc malloc も同様にsize classを持っており、512byte までは8byte 刻みのclass が設定されているため、一概にjemalloc が有利とは言えない(むしろglibc malloc のほうが有利と解釈できる)
ただし、jemalloc は最小で8byte の割り当てができる点が大きい。glibc mallocは16byteである。
以下の記事はmruby でのメモリ使用量最適化について書かれており、Ruby のオブジェクトを管理する基本型VALUE が6byteであるため、glibc malloc では10byte の無駄が生じるが、jemlalloc ではこれが2byte となるため、全体的にメモリ使用量が減っていると考察している。
人間とウェブの未来 - mod_mrubyのメモリ問題をvalgrindで調査の上jemallocで改善
jemalloc の検査機構、ツール、便利関数
jemalloc では次のようなエラー検知が可能である。
- メモリリークの検出
- double free,アラインメント境界違反 の検出
- オーバーフロー(Valgrindと連携して検出)
その他にも様々な機能がある。
- malloc(), free() の際に0ではない無効な値(0xa5)で領域を埋める。
- 使用状況・内部状況をHuman readable な形式で出力(プロセス終了時、API呼び出し時)
- 内部パラメータ変更によるチューニング手段の提供(数十のパラメータ)
メモリリークについては、プロセス終了時にサマリを提供してくれる他に、GoogleのTcmalloc の成果であるpprof というツールに対応しており、より詳細な解析を可能としている。
pprofの出力 (引用元:Github)
終わりに
昨今、様々なミドルウェアで使用されるjemalloc について調べた。今後、実際の使い方などについても調べて公開していきたいと思う。
省メモリプログラミング―メモリ制限のあるシステムのためのソフトウェアパターン集 (Software patterns series)
- 作者: ジェイムズノーブル,チャールズウィアー,James Noble,Charles Weir,安藤慶一
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2002/06/20
- メディア: 単行本
- 購入: 1人 クリック: 100回
- この商品を含むブログ (35件) を見る