• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Google Perf Tools (tcmalloc) の使い方
 

Google Perf Tools (tcmalloc) の使い方

on

  • 5,504 views

 

Statistics

Views

Total Views
5,504
Views on SlideShare
5,489
Embed Views
15

Actions

Likes
13
Downloads
33
Comments
0

1 Embed 15

http://www.slideshare.net 15

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Google Perf Tools (tcmalloc) の使い方 Google Perf Tools (tcmalloc) の使い方 Presentation 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.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 中の人