google perf tools (tcmalloc) の使い方
TRANSCRIPT
TCMALLOC使いませんか ?週間 PFI セミナー 2007/12/06太田 一樹 <[email protected]>
WHAT IS TCMALLOC?
The fastest malloc we've seen; works particularly well with threads and STL. Also: threadfriendly heapchecker, heapprofiler, and cpuprofiler.
http://googperftools.sourceforge.net/
我々にぴったり
TCMALLOC 開発動機
TCMalloc > Thread Caching Malloc glibc malloc sucks!
MultiThread アプリケーションにやさしくない
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.heap255.6 24.7% 24.7% 255.6 24.7% GFS_MasterChunk::AddServer184.6 17.8% 42.5% 298.8 28.8% GFS_MasterChunkTable::Create176.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_alloc49.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良いよ!
MultiThread Aware Malloc 速い 賢い 最悪のメモリリークのお供に
HeapProfiler, CpuProfiler としても使えます
Thanks to 中の人