24
TCMALLOC 使いませんか ? 週間 PFI セミナー 2007/12/06 太田 一樹 <[email protected]>

Google Perf Tools (tcmalloc) の使い方

Embed Size (px)

Citation preview

Page 1: Google Perf Tools (tcmalloc) の使い方

TCMALLOC使いませんか ?週間 PFI セミナー 2007/12/06太田 一樹 <[email protected]>

Page 2: Google Perf Tools (tcmalloc) の使い方

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/

Page 3: Google Perf Tools (tcmalloc) の使い方

我々にぴったり

Page 4: Google Perf Tools (tcmalloc) の使い方

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

Page 5: Google Perf Tools (tcmalloc) の使い方

TCMALLOCの実装( ドキュメントの翻訳とも言う )

Page 6: Google Perf Tools (tcmalloc) の使い方

TCMALLOCの実装 (1)

全体で共有する” Central Heap” Thread 毎に”Thread Cache”

双方向にデータが移動可能

定期的に gc が発生し、 ThreadCache のデータを

CentralHeap に書き戻す

32k 以下は ThreadCache,  それ以上は CentralHeap

Page 7: Google Perf Tools (tcmalloc) の使い方

TCMALLOCの実装 (2)

Small Object の場合

サイズ毎 (eg. 8byte, 16byte, 32byte, …) に freelist を管理

Freelist に要素がある場合はそれを取る。 Lock が要らない。

Freelist が空の場合は CentralHeap の freelist から取る。

CentralHeapFreelist が空の場合は CentralHeap で

allocation が発生。何個かを ThreadCache に移動。

Page 8: Google Perf Tools (tcmalloc) の使い方

TCMALLOCの実装 (3)

Large Object の場合

CentralHeap の freelist を見る。 Lock が必要。

page(4k) 単位で扱う。

Freelist が空だったらより大きいサイズの freelist から取って

くる。領域は分割する。より大きいサイズの freelist も全て空

だったら brk 。

Page 9: Google Perf Tools (tcmalloc) の使い方

TCMALLOCの実装 (4)

Deallocation SmallObject の場合は ThreadCache の freelist に返還

ThreadCache のサイズ上限 (2M) を超えた場合は GC が起こ

り不必要な Object を CentralHeap に移動。

Large Object の場合は CentralHeap の freelist に返還

Page 10: Google Perf Tools (tcmalloc) の使い方

BENCHMARK

1 thread 20 threads

特にこの辺注目

Page 11: Google Perf Tools (tcmalloc) の使い方

TCMALLOCの使い方( 別名ドキュメントの翻訳 )

Page 12: Google Perf Tools (tcmalloc) の使い方

使い方 超簡単

LD_PRELOAD する方法もあるがお勧めしないらしい gzip が落ちることがあるのを確認

$ gcc […] ­ltcmalloc

Page 13: Google Perf Tools (tcmalloc) の使い方

TCMALLOC AS HEAPPROFILER

Page 14: Google Perf Tools (tcmalloc) の使い方

TCMALLOC AS HEAPPROFILER

Heap の使用状況をプロファイリングできる どの関数がどれぐらいメモリを使っているか? ある時点と比べてどの関数がどれぐらいメモリをアロ

ケーションしたか?

使い方 $ HEAPPROFILE=/tmp/profile ./a.out

HEAP_PROFILE_ALLOCATION_INTERVAL で指定したサイズのアロケーションが発生する

と、 /tmp/profile.%d.heap というファイルが dump される

Page 15: Google Perf Tools (tcmalloc) の使い方

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)

Page 16: Google Perf Tools (tcmalloc) の使い方

TCMALLOC AS HEAPPROFILER

過去の時点と比較 base 時点と比べてどの関数がどのぐらい allocation し

たか ? Long running な Appliction のメモリリーク解析に最適$ pprof –text ­­base=/tmp/profile.0004.heap \

   ./a.out /tmp/profile.0100.heap

Page 17: Google Perf Tools (tcmalloc) の使い方

TCMALLOC AS HEAPPROFILER

Gif 形式でメモリ使用量を可視化する事も可能

$ pprof –gif ./a.out/tmp/profile.0100.heap > a.gif

Page 18: Google Perf Tools (tcmalloc) の使い方

TCMALLOC AS CPUPROFILER

Page 19: Google Perf Tools (tcmalloc) の使い方

TCMALLOC AS CPUPROFILER

CPU Profiler としても使える ある一定のインターバル毎にどの関数内にいるかをサ

ンプリングする

使い方 CPUPROFILE=/tmp/profile ./a.out

pprof の使い方は HeapChecker の時と同じ

Page 20: Google Perf Tools (tcmalloc) の使い方

TCMALLOC AS CPUPROFILER

Gif 形式

Page 21: Google Perf Tools (tcmalloc) の使い方

TCMALLOC使用実例

Page 22: Google Perf Tools (tcmalloc) の使い方

実例 : SEDUE

Glibc malloc 使用時のメモリの突発的 & 爆発的増

加が無くなった ( 減っているのが偉すぎ ) 。スループットも向上。

Page 23: Google Perf Tools (tcmalloc) の使い方

まとめ

Page 24: Google Perf Tools (tcmalloc) の使い方

TCMALLOC良いよ!

Multi­Thread Aware Malloc 速い 賢い 最悪のメモリリークのお供に

HeapProfiler, CpuProfiler としても使えます

Thanks to  中の人