Google Perf Tools (tcmalloc) の使い方

5,611 views

Published on

  • Be the first to comment

Google Perf Tools (tcmalloc) の使い方

  1. 1. TCMALLOC 使いませんか ? 週間 PFI セミナー 2007/12/06 太田 一樹 <kzk@preferred.jp>
  2. 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. 3. 我々にぴったり
  4. 4. TCMALLOC 開発動機 <ul><li>TCMalloc -> Thread Caching Malloc </li></ul><ul><li>glibc malloc sucks! </li></ul><ul><ul><li>Multi-Thread アプリケーションにやさしくない </li></ul></ul><ul><ul><ul><li>Small Object に関しては tcmalloc の方が glibc malloc より6倍程高速 </li></ul></ul></ul><ul><ul><ul><li>各 Thread では Arena と呼ばれる領域が確保されるが、この領域はスレッド間を移動できない。つまり、スレッド A で大量にメモリを確保して開放した後、スレッドBでメモリを確保しようとしても同じ領域を再利用できない ( らしい ) </li></ul></ul></ul><ul><ul><li>SmallObject の空間使用率が悪い </li></ul></ul><ul><ul><ul><li>8byte の object が N 個ある場合 </li></ul></ul></ul><ul><ul><ul><ul><li>Glibc malloc では 16N bytes </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Tcmalloc では 8N * 1.01 bytes </li></ul></ul></ul></ul>
  5. 5. TCMALLOC の実装 ( ドキュメントの翻訳とも言う )
  6. 6. TCMALLOC の実装 (1) <ul><li>全体で共有する” Central Heap” </li></ul><ul><li>Thread 毎に”Thread Cache” </li></ul><ul><ul><li>双方向にデータが移動可能 </li></ul></ul><ul><ul><li>定期的に gc が発生し、 ThreadCache のデータを CentralHeap に書き戻す </li></ul></ul><ul><ul><li>32k 以下は ThreadCache, それ以上は CentralHeap </li></ul></ul>
  7. 7. TCMALLOC の実装 (2) <ul><li>Small Object の場合 </li></ul><ul><ul><li>サイズ毎 (eg. 8byte, 16byte, 32byte, …) に freelist を管理 </li></ul></ul><ul><ul><li>Freelist に要素がある場合はそれを取る。 Lock が要らない 。 </li></ul></ul><ul><ul><li>Freelist が空の場合は CentralHeap の freelist から取る。 </li></ul></ul><ul><ul><li>CentralHeapFreelist が空の場合は CentralHeap で allocation が発生。何個かを ThreadCache に移動。 </li></ul></ul>
  8. 8. TCMALLOC の実装 (3) <ul><li>Large Object の場合 </li></ul><ul><ul><li>CentralHeap の freelist を見る。 Lock が必要。 </li></ul></ul><ul><ul><li>page(4k) 単位で扱う。 </li></ul></ul><ul><ul><ul><li>Freelist が空だったらより大きいサイズの freelist から取ってくる。領域は分割する。より大きいサイズの freelist も全て空だったら brk 。 </li></ul></ul></ul>
  9. 9. TCMALLOC の実装 (4) <ul><li>Deallocation </li></ul><ul><ul><li>SmallObject の場合は ThreadCache の freelist に返還 </li></ul></ul><ul><ul><ul><li>ThreadCache のサイズ上限 (2M) を超えた場合は GC が起こり不必要な Object を CentralHeap に移動。 </li></ul></ul></ul><ul><ul><li>Large Object の場合は CentralHeap の freelist に返還 </li></ul></ul>
  10. 10. BENCHMARK <ul><li>1 thread </li></ul><ul><li>20 threads </li></ul>特にこの辺注目
  11. 11. TCMALLOC の使い方 ( 別名ドキュメントの翻訳 )
  12. 12. 使い方 <ul><li>超簡単 </li></ul><ul><li>LD_PRELOAD する方法もあるがお勧めしないらしい </li></ul><ul><ul><li>gzip が落ちることがあるのを確認 </li></ul></ul>$ gcc […] -ltcmalloc
  13. 13. TCMALLOC AS HEAPPROFILER
  14. 14. TCMALLOC AS HEAPPROFILER <ul><li>Heap の使用状況をプロファイリングできる </li></ul><ul><ul><li>どの関数がどれぐらいメモリを使っているか? </li></ul></ul><ul><ul><li>ある時点と比べてどの関数がどれぐらいメモリをアロケーションしたか? </li></ul></ul><ul><li>使い方 </li></ul><ul><ul><li>$ HEAPPROFILE=/tmp/profile ./a.out </li></ul></ul><ul><ul><li>HEAP_PROFILE_ALLOCATION_INTERVAL で指定したサイズのアロケーションが発生すると、 /tmp/profile.%d.heap というファイルが dump される </li></ul></ul>
  15. 15. TCMALLOC AS HEAPPROFILER <ul><li>Text 表示 </li></ul>% 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. 16. TCMALLOC AS HEAPPROFILER <ul><li>過去の時点と比較 </li></ul><ul><ul><li>base 時点と比べてどの関数がどのぐらい allocation したか ? </li></ul></ul><ul><ul><li>Long running な Appliction のメモリリーク解析に最適 </li></ul></ul>$ pprof –text --base=/tmp/profile.0004.heap ./a.out /tmp/profile.0100.heap
  17. 17. TCMALLOC AS HEAPPROFILER <ul><li>Gif 形式でメモリ使用量を可視化する事も可能 </li></ul>$ pprof –gif ./a.out/tmp/profile.0100.heap > a.gif
  18. 18. TCMALLOC AS CPUPROFILER
  19. 19. TCMALLOC AS CPUPROFILER <ul><li>CPU Profiler としても使える </li></ul><ul><ul><li>ある一定のインターバル毎にどの関数内にいるかをサンプリングする </li></ul></ul><ul><li>使い方 </li></ul><ul><ul><li>CPUPROFILE=/tmp/profile ./a.out </li></ul></ul><ul><li>pprof の使い方は HeapChecker の時と同じ </li></ul>
  20. 20. TCMALLOC AS CPUPROFILER <ul><li>Gif 形式 </li></ul>
  21. 21. TCMALLOC 使用実例
  22. 22. 実例 : SEDUE <ul><li>Glibc malloc 使用時のメモリの突発的 & 爆発的増加が無くなった ( 減っているのが偉すぎ ) 。スループットも向上。 </li></ul>
  23. 23. まとめ
  24. 24. TCMALLOC 良いよ! <ul><li>Multi-Thread Aware Malloc </li></ul><ul><ul><li>速い </li></ul></ul><ul><ul><li>賢い </li></ul></ul><ul><ul><li>最悪のメモリリークのお供に </li></ul></ul><ul><li>HeapProfiler, CpuProfiler としても使えます </li></ul><ul><li>Thanks to 中の人 </li></ul>

×