Contenu connexe
Similaire à perfを使ったPostgreSQLの解析(前編)
Similaire à perfを使ったPostgreSQLの解析(前編) (20)
perfを使ったPostgreSQLの解析(前編)
- 2. Agenda
u 前編
1. はじめに
2. プロファイリングとは?
3. perfとは
4. perfの仕組み
5. perfと他のパフォーマンス解析ツールとの⽐比較
6. perfの導⼊入と使い⽅方
7. perfを使ってみよう
8. まとめ
Copyright © 2012NTT DATA Corporation 2
- 3. Agenda
u 後編
1. 前編の復復習
2. perfを使ったプロファイリングの流流れ
3. PostgreSQLをプロファイリングしてみよう
4. perfの使いどころ
5. まとめ
Copyright © 2012NTT DATA Corporation 3
- 5. あらためまして⾃自⼰己紹介
⽒氏名 所属
NTTデータ
江川 ⼤大地 基盤システム事業本部
Twitter システム⽅方式技術ビジネスユニット
@daiti0804
やっていたこと
年年代 やったこと
-‐‑‒2009 歴史のお勉強(⼤大学時代)
2009-‐‑‒2011 Webシステム開発(Javaなど)
2011-‐‑‒現在 PostgreSQL関係
近況
沖縄に⾏行行ってました。
Copyright © 2011 NTT© 2012 CORPORATION
Copyright DATA NTT DATA Corporation 5
- 6. 本⽇日のお題
お題 perfを使ったPostgreSQLの解析(前編)
今⽇日説明
perfの仕組みや使い⽅方
すること
Copyright © 2012 NTT DATA Corporation 6
- 7. 参考資料料
n 本⽇日の講演に当たって参考にした資料料等
n perf ソースコード
̶— [Linuxカーネルソースのルート]/tools/perf配下
n perf ドキュメント
̶— [Linuxカーネルソースのルート]/tools/perf/Documentation
n perf wiki
̶— https://perf.wiki.kernel.org/index.php/Main_̲Page
n 『Linuxカーネル Hacks
―パフォーマンス改善、開発効率率率向上、省省電⼒力力化のためのテクニック』
⾼高橋 浩和 (監修), 池⽥田 宗広, ⼤大岩 尚宏, 島本 裕志, ⽵竹部 晶雄, 平松 雅⺒巳
(著)
Copyright © 2012NTT DATA Corporation 7
- 9. トラブルシューティングとは?
障害発⽣生 解析 対処
現状把握 切切り分け 原因特定 暫定対処 根本解決
運⽤用中に取得し 運⽤用中に取得し 問題がなぜ起き 障害を避けるた 同様の障害が発
た情報や顧客か た情報や、シス たのか、どう めに暫定的な対 ⽣生しないように
らのヒアリング テムのログ、シ いった処理理が原 処を実施する。 根本的な対処を
を通して、実際 ステムが出すそ 因かを特定する。 ⾏行行う。
に何が起きてい の他の情報を元
るのかを把握す に、どこに問題
る。 があるのかを特
定する。
Copyright © 2012 NTT DATA Corporation 9
- 10. トラブルシューティングとは?
障害発⽣生 解析 対処
現状把握 切切り分け 原因特定 暫定対処 根本解決
運⽤用中に取得し 運⽤用中に取得し 問題がなぜ起き 障害を避けるた 同様の障害が発
た情報や顧客か た情報や、シス たのか、どう めに暫定的な対 ⽣生しないように
らのヒアリング テムのログ、シ いった処理理が原 処を実施する。 根本的な対処を
を通して、実際 ステムが出すそ 因かを特定する。 ⾏行行う。
に何が起きてい の他の情報を元
るのかを把握す に、どこに問題
る。 があるのかを特
定する。
perfを使うタイミング
Copyright © 2012 NTT DATA Corporation 10
- 11. 解析とは?
n 解析とは
̶— ログやエラーメッセージなどシステムから得られる情報から、何が起きている
かを把握し、どこに問題があるのかを特定し、その原因を突き⽌止めること。
n なぜ解析をするのか
̶— やみくもに対策を打っても、弾があたらないため。原因を特定することで、適
切切な対策を打つために実施する。
n 解析⼿手法の例例
̶— ログ解析
̶— プロファイリング
Copyright © 2012 NTT DATA Corporation 11
- 12. プロファイリングとは
n プロファイリングとは
̶— プログラムのどの部分がボトルネックとなって処理理に時間がかかっているのか
など、障害の原因を特定すること。
Copyright © 2012 NTT DATA Corporation 12
- 14. perfとは
n perf(Performance Counters for Linux)とは?
- Linuxカーネル上の統合パフォーマンスツール
- イベント数計測にCPUに内蔵されているレジスタを使⽤用
- perf tools (ツールの集合体、サブコマンド群)
n イベントとは??
- perfの計測対象
Copyright © 2012 NTT DATA Corporation 14
- 15. イベントの分類
分類 説明 具体例例
Hardware event プロッセサで計測されるイ cpu-‐‑‒cycles, cache-‐‑‒missesなど
ベント。
Software event カーネルのカウンタで計測 cpu-‐‑‒clock, page-‐‑‒faultsなど
されるイベント。
Hardware cache event プロッセサで計測されるイ L1-‐‑‒dcache-‐‑‒load-‐‑‒misses,
ベント。 branch-‐‑‒loadsなど
Tracepoint event カーネルの処理理を記録する sched:sched_̲stat_̲runtime,
ためにカーネルに埋め込ま syscalls:sys_̲enter_̲socket
れたトレースポイント。 など
Copyright © 2012 NTT DATA Corporation 15
- 16. プロファイラとしてありたい姿
WHAT DO WE CARE?
• The Linux Performance Events Subsystem provides a
low overhead way to measure the workloads of a single
application or the full system
• Itʼ’s at least an order of magnitude faster than an
instrumenting profiler
• It provides far more information compared to statistical
profiler
Roberto A. Vitillo (ローレンス・バークレー国⽴立立研究所)の“Future computing in particle
physics”カンファレンスにおける講演資料料「PERFORMANCE TOOLS DEVELOPMENTS」
(2011年年6⽉月16⽇日)より。
Copyright © 2012 NTT DATA Corporation 16
- 17. プロファイラとしてありたい姿
§ 低いオーバヘッド
- 解析対象のシステムは既に何らかのオーバヘッドが発⽣生している
ことが多い。そこにさらに負荷がかかるツールを使おうとしても、
ツールが動かなかったり、システムがダウンする可能性もある。
§ 多くの情報
- トラブルの原因はいっぱい考えられるから。
§ ⾒見見やすい表⽰示(多くの情報の中から取捨選択が可能)
- なにがどう書いてあるのか分からないと、トラブルの原因が表⽰示
されていても⾒見見落落とす可能性もある。
Copyright © 2012 NTT DATA Corporation 17
- 18. perfについて〜~その他
§ いつLinuxカーネルに統合されたの?
- Linuxカーネル 2.6.31
§ 誰が作ったの?
- Ingo Molnar⽒氏が中⼼心となって開発が進められた。
§ メンテナは?
- Ingo Molnar⽒氏(Red Hat)
- Arnaldo Carvelho de Melo⽒氏(Red Hat)
Copyright © 2012 NTT DATA Corporation 18
- 20. perfのフロー 〜~イベントの指定
ユーザ # perf stat XX
“perf_̲event_̲open”(
システムコール)で処
理理を依頼
カーネル
Software eventの場合
カウンタ
Hardware event
の場合
レジスタに取得するイベントを設定
ハードウェア(レジスタ)
イベント指定レジスタ
カウンタレジスタ
Copyright © 2012 NTT DATA Corporation 20
- 21. perfのフロー 〜~データの保存
ユーザ # perf stat XX
カーネル
Software eventの場合
カウンタ
Hardware event
の場合
レジスタから値を取得。
ハードウェア(レジスタ)
イベント指定レジスタ
カウンタレジスタ
Copyright © 2012 NTT DATA Corporation 21
- 22. perfのフロー 〜~データの保存
ユーザ # perf stat XX
加⼯工して値を返す。
カーネル
カウンタ
レジスタから値を取得。
ハードウェア(レジスタ)
イベント指定レジスタ
カウンタレジスタ
Copyright © 2012 NTT DATA Corporation 22
- 23. perfの仕組み
perfでは、perf_̲event_̲openというシステムコールを利利⽤用し
てカーネルから値を取ってきている。
■ include/linux/syscalls.h より
:
:
asmlinkage long sys_̲perf_̲event_̲open(
struct perf_̲event_̲attr _̲_̲user *attr_̲uptr,
pid_̲t pid, int cpu, int group_̲fd, unsigned long flags);
:
:
■ tools/perf/perf.h より
:
:
sys_̲perf_̲event_̲open(struct perf_̲event_̲attr *attr,
pid_̲t pid, int cpu, int group_̲fd,
unsigned long flags)
{
attr-‐‑‒>size = sizeof(*attr);
return syscall(_̲_̲NR_̲perf_̲event_̲open, attr, pid, cpu,
group_̲fd, flags);
}
:
:
Copyright © 2012 NTT DATA Corporation 23
- 26. 他のツールとの⽐比較
perf Oprofile SystemTap
オーバヘッド 低 低 スクリプト次第
(漏漏れなく追跡する)
情報量量 多 中 多
情報の取捨選択 可能 可能 可能
Copyright © 2012 NTT DATA Corporation 26
- 27. 他のツールとの⽐比較
perf Oprofile SystemTap
オーバヘッド 低 低 ⾼高
(漏漏れなく追跡する)
情報の取捨選択 可能 可能 不不可能
動的監視 可能 不不可能 可能
指向性 中 低 ⾼高
(システム全体も処理理 (システム全体のプロ (アドホックなプロ
個別のプロファイリ ファイリング向き) ファイリング向き)
ングも可能)
危険性 低 低 ⾼高
(スクリプト暴暴⾛走の可
能性)
Copyright © 2012 NTT DATA Corporation 27
- 29. 今回の講演に当たって使⽤用した環境
ソフトウェア名 バージョン 備考
Ubuntu 12.04
Linux kernel 3.2.0
VirtualBox 4.1.22 仮想化ソフト
VirtualBox
n VirtualBox上のサーバ
OS:Ununtu 12.04
カーネル:Linux kernel3.2.0
Macbook Air
Copyright © 2012 NTT DATA Corporation 29
- 30. 【参考】perfがサポートされているかの確認
§ カーネルバージョンの確認
- Linux kernel 2.6以上でサポートされている
※コマンドによっては、より新しいバージョンのみにしか対応していないものもある。
§ コンフィギュアオプションの確認
- CONFIG_̲PERF_̲xxxx というオプションが
有効になっていれば、perf がサポートされている。
※コンフィギュアオプションの確認⽅方法
/boot配下の” config-‐‑‒<カーネルバージョン>-‐‑‒generic-‐‑‒pae”ファイルを確認。
Copyright © 2012NTT DATA Corporation 30
- 31. perfの導⼊入
n perfをインストールするには、以下の2つの⽅方法がある。
1. apt-‐‑‒get, yumを使う⽅方法
2. ソースからインストールする⽅方法
Copyright © 2012 NTT DATA Corporation 31
- 33. perfの導⼊入〜~1.apt-‐‑‒getによるインストール
§ perfのインストール
- 以下のコマンドを⼊入⼒力力
# sudo apt-‐‑‒get install linux-‐‑‒tools-‐‑‒3.2.0-‐‑‒30
:
以下のパッケージが新たにインストールされます:
linux-‐‑‒tools-‐‑‒3.2.0-‐‑‒30
:
linux-‐‑‒tools-‐‑‒3.2.0-‐‑‒30 (3.2.0-‐‑‒30.48)を設定しています...
:
Copyright © 2012 NTT DATA Corporation 33
- 34. perfの導⼊入〜~2.ソースからのインストール
§ 準備
- libdw-‐‑‒dev or elfutils-‐‑‒libelf-‐‑‒devel が必要
Copyright © 2012 NTT DATA Corporation 34
- 35. perfの導⼊入〜~2.ソースからのインストール
§ perfのインストール
- 以下のコマンドを⼊入⼒力力
# sudo apt-‐‑‒get install linux-‐‑‒source
:
以下のパッケージが新たにインストールされます:
linux-‐‑‒source linux-‐‑‒source-‐‑‒3.2.0
:
linux-‐‑‒source-‐‑‒3.2.0を設定しています…
:
# tar xjf linux-‐‑‒source-‐‑‒3.2.0.tar.bz2
# cd <カーネルソースのルート>/tools/perf
# make
# make install
Copyright © 2012 NTT DATA Corporation 35
- 36. 動作確認
§ 動作確認
- 以下のコマンドを⼊入⼒力力
# perf list
List of pre-‐‑‒defined events (to be used in -‐‑‒e):
cpu-‐‑‒cycles OR cycles [Hardware event]
stalled-‐‑‒cycles-‐‑‒frontend OR idle-‐‑‒cycles-‐‑‒frontend [Hardware event]
stalled-‐‑‒cycles-‐‑‒backend OR idle-‐‑‒cycles-‐‑‒backend [Hardware event]
instructions [Hardware event]
:
:
cpu-‐‑‒clock [Software event]
task-‐‑‒clock [Software event]
:
:
perfで利利⽤用可能なプロファイルイベントの
⼀一覧が、表⽰示されれば、ok!!
Copyright © 2012 NTT DATA Corporation 36
- 37. perf の使い⽅方
§ perfの使い⽅方
# perf <コマンド> [オプション]
§ 代表的なコマンド
コマンド 説明
perf annotate perf recordで作成したperfのデータを読み込み、 関数で呼び出した命令令レベ
ルのトレース結果を表⽰示する。
perf probe 新たに動的なトレースポイント(イベント)を定義する。
perf record イベントの記録を⾏行行う。
perf report perf recordで記録したイベントをプロンプトに表⽰示する。
perf script perf recordで作成したperfのデータを読み込み、 トレース結果を表⽰示する。
perf stat 引数に指定したコマンドのパフォーマンスカウンタの値を表⽰示する。
perf top Linuxコマンドの”top”のように動的にシステム監視を⾏行行う。
Copyright © 2012 NTT DATA Corporation 37
- 41. perf stat 〜~オプション
§ 代表的なオプション
コマンド 説明
-‐‑‒e イベントを指定する。
-‐‑‒p プロセスIDを指定する。
-‐‑‒t スレッドIDを指定する。
-‐‑‒a 全CPU上のプロセスを指定する。
-‐‑‒C 特定のCPU上のプロセスを指定する。
-‐‑‒B 計測結果にカンマを⼊入れて表⽰示する。(ex.1,000)
Copyright © 2012 NTT DATA Corporation 41
- 42. perf stat 〜~実⾏行行例例
n perf stat の実⾏行行例例を以下に⽰示す。
# perf stat -‐‑‒B dd if=/dev/zero of=/dev/null count=1000000
1000000+0 レコード⼊入⼒力力
1000000+0 レコード出⼒力力
512000000 バイト (512 MB) コピーされました、 0.433087 秒、 1.2 GB/秒
Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':
436.626492 task-‐‑‒clock # 0.957 CPUs utilized
24 context-‐‑‒switches # 0.000 M/sec
0 CPU-‐‑‒migrations # 0.000 M/sec
252 page-‐‑‒faults # 0.001 M/sec
<not supported> cycles
<not supported> stalled-‐‑‒cycles-‐‑‒frontend
<not supported> stalled-‐‑‒cycles-‐‑‒backend
<not supported> instructions
<not supported> branches
<not supported> branch-‐‑‒misses
0.456183302 seconds time elapsed
※ 特にイベント指定しなければ、 perf stat は上記のイベントの集計をする
Copyright © 2012 NTT DATA Corporation 42
- 44. perf top〜~使⽤用例例
n perf topの実⾏行行例例を以下に⽰示す。
# perf top
Copyright © 2012 NTT DATA Corporation 44
- 45. perf top〜~オプション
§ 代表的なオプション
コマンド 説明
-‐‑‒e イベントを指定する。
-‐‑‒p プロセスIDを指定する。
-‐‑‒t スレッドIDを指定する。
-‐‑‒a 全CPU上のプロセスを指定する。
-‐‑‒C 特定のCPU上のプロセスを指定する。
Copyright © 2012 NTT DATA Corporation 45
- 46. perf record & perf report
perf recordは、イベントの記録を⾏行行う。記録したデータは、データファイル
(デフォルト名はperf.data)として保存される。そのデータファイルは、
perf reportで⾒見見ることができる。
n こんな時に便便利利
̶— あるコマンドについての動作を詳細に記録したい。
̶— 怪しい処理理について、詳細に解析したい。
̶— 性能の悪い処理理について、何が原因なのか知りたい。
Copyright © 2012 NTT DATA Corporation 46
- 47. perf report〜~オプション
§ 代表的なオプション
コマンド 説明
-‐‑‒e イベントを指定する。
-‐‑‒o 出⼒力力ファイル名を指定する(デフォルトは”perf.data”)
-‐‑‒p プロセスIDを指定する。
-‐‑‒t スレッドIDを指定する。
-‐‑‒a 全CPU上のプロセスを指定する。
-‐‑‒C 特定のCPU上のプロセスを指定する。
Copyright © 2012 NTT DATA Corporation 47
- 48. perf record〜~オプション
§ 代表的なオプション
コマンド 説明
-‐‑‒i ⼊入⼒力力ファイル名を指定する(⼊入⼒力力しないとカレンとディレクトリ
の”perf.data”を⼊入⼒力力ファイルとする)
-‐‑‒s pidなどでソートする。
Copyright © 2012 NTT DATA Corporation 48
- 49. perf record & perf report 〜~使⽤用例例
n perf recordの実⾏行行例例を以下に⽰示す。
# perf record -‐‑‒e cpu-‐‑‒clock stress -‐‑‒c 4 -‐‑‒i 2 -‐‑‒m 2 -‐‑‒-‐‑‒timeout 10s
stress: info: [5843] dispatching hogs: 4 cpu, 2 io, 2 vm, 0 hdd
stress: info: [5843] successful run completed in 10s
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.247 MB perf.data (~∼10775 samples) ]
# ls
perf.data
Copyright © 2012 NTT DATA Corporation 49
- 50. perf record & perf report 〜~使⽤用例例
n perf reportの実⾏行行例例を以下に⽰示す。
オーバヘッド コマンドオブジェクト名 シンボル名
Copyright © 2012 NTT DATA Corporation 50
- 51. perf record & perf report 〜~Tips
n perf recoerdで得られるデータファイル(perf.data)は、同名のファイルが
あっても、上書きされずに、古いファイルを”perf.data.old”として対⽐比して
くれる。ただし、”perf.data.old”までは退避処理理をしてくれないので注意。
# perf record -‐‑‒e cpu-‐‑‒clock stress -‐‑‒c 4 -‐‑‒i 2 -‐‑‒m 2 -‐‑‒-‐‑‒timeout 10s
stress: info: [5843] dispatching hogs: 4 cpu, 2 io, 2 vm, 0 hdd
stress: info: [5843] successful run completed in 10s
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.247 MB perf.data (~∼10775 samples) ]
# ls
perf.data
# perf record -‐‑‒e cpu-‐‑‒clock stress -‐‑‒c 4 -‐‑‒i 2 -‐‑‒m 2 -‐‑‒-‐‑‒timeout 10s
:
:
# ls
perf.data perf.data.old
# perf record -‐‑‒e cpu-‐‑‒clock stress -‐‑‒c 4 -‐‑‒i 2 -‐‑‒m 2 -‐‑‒-‐‑‒timeout 10s
:
:
# ls
perf.data perf.data.old
Copyright © 2012 NTT DATA Corporation 51