第102回カーネル読書会に行ってきました

自分用メモ

DTraceでできること

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解析ことはじめ

自己紹介

奥野幹也(Sun)さん

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
  • カーネル/ユーザプロセスをトレース
  • プローブと呼ばれる観測点を対象んプログラムに動的に埋め込む
  • プローブの種類に応じたプロバイダ
  • D言語と呼ばれるプログラムで操作

[ユーザ空間] ユーザプロセス 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を呼び出すときに、そのユーザープロセスに対してデータを流し込むためのハンドラ。現状では利用されない

DTrace Tools

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
{
.
.
.
}
Q&A
  • fastrapをマクロで埋め込む場合の注意すべき点
    • MySQLで使われているテクニック
      • Linuxはdtraceがない
      • preprocessで#define文でなにも埋め込まれない
  • linux fastrapのような支援マクロはある?
    • ない
  • dtraceではなく(5.4以下)filesortしているものを抽出するには
    • 関数の境界はdtraceが使える(pidプロバイダ)
  • dtraceをして負荷が増してdownが嫌
    • そういうこともある
    • 関数の境界を*で引っかけると負荷がかかる
    • 対象をしぼってtraceすることが重要
    • まずはOSのstatでどこがネックになっているか調べる

プレゼンやソースが公開されているみたいです
漢(オトコ)のコンピュータ道: 第102回カーネル読書会 at 楽天のプレゼン資料公開しました。 #kernel100329