jemalloc について調べたのでまとめた

※この記事は3回シリーズのうちの一つ

jemalloc について調べたのでまとめた - zonomasaの日記

続 jemalloc について調べたのでまとめた(ビルドと組み込み方法) - zonomasaの日記

jemalloc の解析機能 - zonomasaの日記

photo by mutednarayan

jemalloc とは

jemalloc は、標準ライブラリで定義されているmalloc, free 等のメモリアロケーション APIの実装である。

jemalloc : 公式ページ

jemalloc は2005年より、Jason Evans によって開発されており、SMPでのスケーラビリティのためにFreeBSD のlibcに取り込ま標準アロケータとなっている。

その他にも、Facebook の内部や、KVS のRedisfluentd などにも取り込まれている。

具体的には、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 というツールに対応しており、より詳細な解析を可能としている。

https://github.com/jemalloc/jemalloc/wiki/images/w.png pprofの出力 (引用元:Github

終わりに

昨今、様々なミドルウェアで使用されるjemalloc について調べた。今後、実際の使い方などについても調べて公開していきたいと思う。

省メモリプログラミング―メモリ制限のあるシステムのためのソフトウェアパターン集 (Software patterns series)

省メモリプログラミング―メモリ制限のあるシステムのためのソフトウェアパターン集 (Software patterns series)

  • 作者: ジェイムズノーブル,チャールズウィアー,James Noble,Charles Weir,安藤慶一
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2002/06/20
  • メディア: 単行本
  • 購入: 1人 クリック: 100回
  • この商品を含むブログ (35件) を見る

参考リンク