google perf tools (tcmalloc) の使い方

Post on 13-Jul-2015

4.263 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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.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良いよ!

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

HeapProfiler, CpuProfiler としても使えます

Thanks to  中の人

top related