TCMALLOC 使いませんか ? 週間 PFI セミナー  2007/12/06 太田 一樹  <kzk@preferred.jp>
WHAT IS TCMALLOC? The fastest malloc we've seen;  works particularly well with threads and STL . Also: thread-friendly heap-checker, heap-profiler, and cpu-profiler. http://goog-perftools.sourceforge.net/
我々にぴったり
TCMALLOC  開発動機 TCMalloc -> Thread Caching Malloc glibc malloc sucks! Multi-Thread アプリケーションにやさしくない Small Object に関しては tcmalloc の方が glibc malloc より6倍程高速 各 Thread では Arena と呼ばれる領域が確保されるが、この領域はスレッド間を移動できない。つまり、スレッド A で大量にメモリを確保して開放した後、スレッドBでメモリを確保しようとしても同じ領域を再利用できない  ( らしい ) SmallObject の空間使用率が悪い 8byte の object が N 個ある場合 Glibc malloc では 16N bytes Tcmalloc では 8N * 1.01 bytes
TCMALLOC の実装 ( ドキュメントの翻訳とも言う )
TCMALLOC の実装 (1) 全体で共有する” Central Heap” Thread 毎に”Thread Cache” 双方向にデータが移動可能 定期的に gc が発生し、 ThreadCache のデータを CentralHeap に書き戻す 32k 以下は ThreadCache,  それ以上は CentralHeap
TCMALLOC の実装 (2) Small Object の場合 サイズ毎 (eg. 8byte, 16byte, 32byte, …) に freelist を管理 Freelist に要素がある場合はそれを取る。 Lock が要らない 。 Freelist が空の場合は CentralHeap の freelist から取る。 CentralHeapFreelist が空の場合は CentralHeap で allocation が発生。何個かを ThreadCache に移動。
TCMALLOC の実装 (3) Large Object の場合 CentralHeap の freelist を見る。 Lock が必要。 page(4k) 単位で扱う。 Freelist が空だったらより大きいサイズの freelist から取ってくる。領域は分割する。より大きいサイズの freelist も全て空だったら brk 。
TCMALLOC の実装 (4) Deallocation SmallObject の場合は ThreadCache の freelist に返還 ThreadCache のサイズ上限 (2M) を超えた場合は GC が起こり不必要な Object を CentralHeap に移動。 Large Object の場合は CentralHeap の freelist に返還
BENCHMARK 1 thread 20 threads 特にこの辺注目
TCMALLOC の使い方 ( 別名ドキュメントの翻訳 )
使い方 超簡単 LD_PRELOAD する方法もあるがお勧めしないらしい gzip が落ちることがあるのを確認 $ gcc […] -ltcmalloc
TCMALLOC AS HEAPPROFILER
TCMALLOC AS HEAPPROFILER Heap の使用状況をプロファイリングできる どの関数がどれぐらいメモリを使っているか? ある時点と比べてどの関数がどれぐらいメモリをアロケーションしたか? 使い方 $ HEAPPROFILE=/tmp/profile ./a.out HEAP_PROFILE_ALLOCATION_INTERVAL で指定したサイズのアロケーションが発生すると、 /tmp/profile.%d.heap というファイルが dump される
TCMALLOC AS HEAPPROFILER Text 表示 % pprof --text /usr/bin/gfs_master /tmp/profile.0100.heap 255.6 24.7% 24.7% 255.6 24.7% GFS_MasterChunk::AddServer 184.6 17.8% 42.5% 298.8 28.8% GFS_MasterChunkTable::Create 176.2 17.0% 59.5% 729.9 70.5% GFS_MasterChunkTable::UpdateState  169.8 16.4% 75.9% 169.8 16.4% PendingClone::PendingClone  76.3 7.4% 83.3% 76.3 7.4% __default_alloc_template::_S_chunk_alloc 49.5 4.8% 88.0% 49.5 4.8% hashtable::resize メモリ使用量 (M) その関数呼び出す全ての関数の メモリ使用量の和 (M)
TCMALLOC AS HEAPPROFILER 過去の時点と比較 base 時点と比べてどの関数がどのぐらい allocation したか ? Long running な Appliction のメモリリーク解析に最適 $ pprof –text  --base=/tmp/profile.0004.heap  \ ./a.out /tmp/profile.0100.heap
TCMALLOC AS HEAPPROFILER Gif 形式でメモリ使用量を可視化する事も可能 $ pprof –gif ./a.out/tmp/profile.0100.heap > a.gif
TCMALLOC AS CPUPROFILER
TCMALLOC AS CPUPROFILER CPU Profiler としても使える ある一定のインターバル毎にどの関数内にいるかをサンプリングする 使い方 CPUPROFILE=/tmp/profile ./a.out pprof の使い方は HeapChecker の時と同じ
TCMALLOC AS CPUPROFILER Gif 形式
TCMALLOC 使用実例
実例 : SEDUE Glibc malloc 使用時のメモリの突発的 & 爆発的増加が無くなった ( 減っているのが偉すぎ ) 。スループットも向上。
まとめ
TCMALLOC 良いよ! Multi-Thread Aware Malloc 速い 賢い 最悪のメモリリークのお供に HeapProfiler, CpuProfiler としても使えます Thanks to  中の人

Google Perf Tools (tcmalloc) の使い方

  • 1.
    TCMALLOC 使いませんか ?週間 PFI セミナー 2007/12/06 太田 一樹 <kzk@preferred.jp>
  • 2.
    WHAT IS TCMALLOC?The fastest malloc we've seen; works particularly well with threads and STL . Also: thread-friendly heap-checker, heap-profiler, and cpu-profiler. http://goog-perftools.sourceforge.net/
  • 3.
  • 4.
    TCMALLOC 開発動機TCMalloc -> Thread Caching Malloc glibc malloc sucks! Multi-Thread アプリケーションにやさしくない Small Object に関しては tcmalloc の方が glibc malloc より6倍程高速 各 Thread では Arena と呼ばれる領域が確保されるが、この領域はスレッド間を移動できない。つまり、スレッド A で大量にメモリを確保して開放した後、スレッドBでメモリを確保しようとしても同じ領域を再利用できない ( らしい ) SmallObject の空間使用率が悪い 8byte の object が N 個ある場合 Glibc malloc では 16N bytes Tcmalloc では 8N * 1.01 bytes
  • 5.
    TCMALLOC の実装 (ドキュメントの翻訳とも言う )
  • 6.
    TCMALLOC の実装 (1)全体で共有する” Central Heap” Thread 毎に”Thread Cache” 双方向にデータが移動可能 定期的に gc が発生し、 ThreadCache のデータを CentralHeap に書き戻す 32k 以下は ThreadCache, それ以上は CentralHeap
  • 7.
    TCMALLOC の実装 (2)Small Object の場合 サイズ毎 (eg. 8byte, 16byte, 32byte, …) に freelist を管理 Freelist に要素がある場合はそれを取る。 Lock が要らない 。 Freelist が空の場合は CentralHeap の freelist から取る。 CentralHeapFreelist が空の場合は CentralHeap で allocation が発生。何個かを ThreadCache に移動。
  • 8.
    TCMALLOC の実装 (3)Large Object の場合 CentralHeap の freelist を見る。 Lock が必要。 page(4k) 単位で扱う。 Freelist が空だったらより大きいサイズの freelist から取ってくる。領域は分割する。より大きいサイズの freelist も全て空だったら brk 。
  • 9.
    TCMALLOC の実装 (4)Deallocation SmallObject の場合は ThreadCache の freelist に返還 ThreadCache のサイズ上限 (2M) を超えた場合は GC が起こり不必要な Object を CentralHeap に移動。 Large Object の場合は CentralHeap の freelist に返還
  • 10.
    BENCHMARK 1 thread20 threads 特にこの辺注目
  • 11.
    TCMALLOC の使い方 (別名ドキュメントの翻訳 )
  • 12.
    使い方 超簡単 LD_PRELOADする方法もあるがお勧めしないらしい gzip が落ちることがあるのを確認 $ gcc […] -ltcmalloc
  • 13.
  • 14.
    TCMALLOC AS HEAPPROFILERHeap の使用状況をプロファイリングできる どの関数がどれぐらいメモリを使っているか? ある時点と比べてどの関数がどれぐらいメモリをアロケーションしたか? 使い方 $ HEAPPROFILE=/tmp/profile ./a.out HEAP_PROFILE_ALLOCATION_INTERVAL で指定したサイズのアロケーションが発生すると、 /tmp/profile.%d.heap というファイルが dump される
  • 15.
    TCMALLOC AS HEAPPROFILERText 表示 % pprof --text /usr/bin/gfs_master /tmp/profile.0100.heap 255.6 24.7% 24.7% 255.6 24.7% GFS_MasterChunk::AddServer 184.6 17.8% 42.5% 298.8 28.8% GFS_MasterChunkTable::Create 176.2 17.0% 59.5% 729.9 70.5% GFS_MasterChunkTable::UpdateState 169.8 16.4% 75.9% 169.8 16.4% PendingClone::PendingClone 76.3 7.4% 83.3% 76.3 7.4% __default_alloc_template::_S_chunk_alloc 49.5 4.8% 88.0% 49.5 4.8% hashtable::resize メモリ使用量 (M) その関数呼び出す全ての関数の メモリ使用量の和 (M)
  • 16.
    TCMALLOC AS HEAPPROFILER過去の時点と比較 base 時点と比べてどの関数がどのぐらい allocation したか ? Long running な Appliction のメモリリーク解析に最適 $ pprof –text --base=/tmp/profile.0004.heap \ ./a.out /tmp/profile.0100.heap
  • 17.
    TCMALLOC AS HEAPPROFILERGif 形式でメモリ使用量を可視化する事も可能 $ pprof –gif ./a.out/tmp/profile.0100.heap > a.gif
  • 18.
  • 19.
    TCMALLOC AS CPUPROFILERCPU Profiler としても使える ある一定のインターバル毎にどの関数内にいるかをサンプリングする 使い方 CPUPROFILE=/tmp/profile ./a.out pprof の使い方は HeapChecker の時と同じ
  • 20.
  • 21.
  • 22.
    実例 : SEDUEGlibc malloc 使用時のメモリの突発的 & 爆発的増加が無くなった ( 減っているのが偉すぎ ) 。スループットも向上。
  • 23.
  • 24.
    TCMALLOC 良いよ! Multi-ThreadAware Malloc 速い 賢い 最悪のメモリリークのお供に HeapProfiler, CpuProfiler としても使えます Thanks to 中の人