第102回カーネル読書会に行ってきました
自分用メモ
DTraceでできること
自己紹介
DTrace
- Solaris10,OpenSolarisで使える
- Mac OSやFreeBSDでportingしている
- Linuxでもportingしている最中
http://blogs.sun.com/bmc/entry/dtrace_on_linux
参考
漢(オトコ)のコンピュータ道: D言語基礎文法最速マスター(DTraceのほう)
DTraceの使いかた
観測点が見える
$ dtrace -l
provider一覧
$ dtrace -i | awk "{print $2}" | sort -u
システムコールのプロバイダを見る
$ dtrace -n 'systemcall:write:entry{@lexecname,pid]=count();}'
関連
trasコマンド
CPU負荷
$ dtrace -n 'profile-997/arg1/{@[ufunc(arg1)}=count();}...'
DTraceによるMySQL解析ことはじめ
MySQL
- OpenSouceのRDBMS
- MySQL AB -> Sun -> Oracle
- 使いやすく、安定、高速
- Oracleに買収されても開発は大丈夫
- MySQLチームはほとんど残っている
- MySQL6.0は廃止
- 機能を詰め込み過ぎた
MySQLエキスパートトラブルシューティングガイド
参考
http://forge.mysql.com/wiki/Main_Page
MySQL :: MySQL Community Downloads
MySQLの特徴
DTrace
[ユーザ空間] ユーザプロセス dtrace
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
[カーネル空間] プロバイダ プローブ
カーネル挙動を追尾する「DTrace」の実力 (1/8) - ITmedia エンタープライズ
プロバイダ | 提供される主な情報 |
dtrace | DTraceの開始時や終了時、エラー発生時などにイベントが発生するプローブ。後述のDスクリプトでプログラムするときに、初期化処理や終了処理、エラー処理などを記述する時に用いる |
lookstat | ロック状態が変化した時にイベント発生するプローブ |
profile | 一定時間ごとにタイマイベントを発生するプローブ。定期的に値を集計したい時などに用いる |
fbt | Function Boundary Tracing。カーネル内部の関数への突入/退出ごとにイベントを発生するプローブ |
syscall | システムコールへの突入/退出ごとにイベント発生するプローブ |
sbt | Statically Defined Tracing。アプリケーション定義のプローブ。アプリケーション開発者があらかじめsys/sdt.hにある関数群を呼び出し、DTraceのイベントを発生させるように構成する時、該当ルーチンを通過するとイベント発生する |
sysinfo | カーネルのステータス情報(kstat -n sysで取得できる情報)を提供するプローブ |
vminfo | カーネルの仮想メモリ情報(kstat -n vmで取得できる情報)を提供するプローブ |
proc | プロセスの生成、終了、シグナル受信などが発生した時にイベント発生するプローブ |
sched | CPUスケジューリングに関する情報を提供するプローブ |
io | ディスク入出力情報に関するプローブ。iostatコマンドで取得できる情報を提供する |
mib | Management Information Bases(MIB)情報を提供するプローブ。kstat -nやnetstatコマンドで取得できる情報を提供する |
fpuinfo | SPARCプロセッサのFPUシミュレート機能状態を提供するプローブ |
pid | 任意のプロセスIDをもつプロセス内の指定した位置の関数への突入/退出ごとにイベントを発生するプローブ |
plockstat | プロセスのロック状態を知らせるプローブ |
fasttrap | ユーザープロセスがDTraceを呼び出すときに、そのユーザープロセスに対してデータを流し込むためのハンドラ。現状では利用されない |
D言語
/述語/ { アクション }
mysqld内に設置可能なprobe
なぜかわからないエラーが出る場合にサーバ側でトレースできる!!
- pid
- 関数のentry
- 関数のreturn
- 関数のoffset
- 書式)pid123
- fasttrap
- MySQL5.4で追加された
- 書式)mysql123
SQL文を抽出
pid$target::*mysql_pgrace*:entry
{
trace(copyinstr(arg1));
}
http://forge.mysql.com/wiki/RandomQueryGenerator
MySQL5.4以降の、include/probes_mysql.d
これとか
./support-files/dtrace/query-filesort-time.d
./support-files/dtrace/query-execandqc.d
./support-files/dtrace/statement-time.d
./support-files/dtrace/query-rowops.d
./support-files/dtrace/query-parse-time.d
./support-files/dtrace/query-time.d
./support-files/dtrace/locktime.d
./support-files/dtrace/statement-type-aggregate.d
./support-files/dtrace/query-network-time.d
MySQL5.4で追加されたfastrrap クエリキャッシュのヒット率を算出
[ThinkIT] 第6回:query_cache_sizeの違いによるパフォーマンス比較 (1/3)
文字列をキーにしてキャッシュ
1000行以上ファイルソートしているクエリを探す
BEGIN { printf("Hit Ctrl+C to exit._n"); } mysql$target::filesort-start { self->sortig = 1; self->db= arg0 == 0 ? "NULL" : copyinstr(arg0); self->table = cpoyinstr(arg1); } mysql$target::filesort-done { . . . }
DTraceToolkit
Q&A
- fastrapをマクロで埋め込む場合の注意すべき点
- linux fastrapのような支援マクロはある?
- ない
- dtraceではなく(5.4以下)filesortしているものを抽出するには
- 関数の境界はdtraceが使える(pidプロバイダ)
- dtraceをして負荷が増してdownが嫌
- そういうこともある
- 関数の境界を*で引っかけると負荷がかかる
- 対象をしぼってtraceすることが重要
- まずはOSのstatでどこがネックになっているか調べる
プレゼンやソースが公開されているみたいです
漢(オトコ)のコンピュータ道: 第102回カーネル読書会 at 楽天のプレゼン資料公開しました。 #kernel100329