めんどいので簡潔に
とりあえず、SystemTapも.SUNW_ldynsymをサポートして「でもstripされていたら行番号トレースはできないからね」という仕様にしたほうがLKMLでdisられなくなっていいんでは?とか思った
- DTraceではself->variable構文をつかうと、per CPU variableを使うので var[hash] よりも速い事が保証されている。連想配列あるからいいじゃんとか言ってるSystemTapは空気読めてない子
- DTraceではAggregation関数で集計すると自前で var += hoge とかやって集計するよりも速い事が保証されている。これは言語の使用目的を考えると必須だよな。とか思った
- DTraceは収集時にAggregate関数の種類を選ぶが、SystemTapは表示時に選ぶ。DTrace方式のほうが無駄な収集が発生しないので賢い
- Speculative Tracingってなんじゃらほい?と思ったら単に主バッファとは別のバッファがつかえるよ。
というだけだった。でも構文は汚いと思う
- バッファアロケートが関数なので、実行時にしか何個バッファが生成されるか分からない。
どう考えても普通はせいぜい1つしか作らないので、柔軟性より速度を追求した方がよい
- 書き出し先バッファ切り替えが関数なので汚い。どうせ1関数内で複数のバッファに書くことは
言語使用上禁止されているのだから関数の修飾子とかにしたほうがよかった気がする
- バッファアロケートが関数なので、実行時にしか何個バッファが生成されるか分からない。
- early boot tracingはかなりがんばっている。SCSI やFilesystemより先にロードされてるんだけど
どうやってるんだ?
- SolarisではELFを独自に拡張してDTrace用のSymbol Tableを別途持っている。かつこれはstripの
対象外なので、stripされたバイナリからでもシンボルが引ける。これはユーザアプリのトレースで
重要な性質。static関数もちゃんとテーブルに名前が残ってるし。SystemTapは行番号トレースと
ローカル変数の参照をサポートしたぶんだけ、必要な情報量が爆発的に増えており、事実上
DWARFを使うしか手がない。
stripされたバイナリをトレースできるようにするのは、仕様変更がいるなぁ
http://blogs.sun.com/ali/entry/what_is_sunw_ldynsym
http://blogs.sun.com/ali/entry/inside_elf_symbol_tables
- バッファポリシーとして
- switch
- fill
- ring
の3つをサポート。switchがデフォルト。
残り2つはearly boot tracingと組み合わせて使う。
fillがバッファがいっぱいになったらこれ以上記録しない。というバッファ。ブート時のログを
とりたいときはバッファがいっぱいになったら自動的に止まって欲しいからね。
ringは逆にバッファがいっぱいになったらバッファ先頭にもどって上書きしていく。
んで、なんかおかしくなったときに、最後のほうのログを吸い出す。
いわゆるフライトレコーダー目的
- switch
- ユーザ空間のトレースはある関数の全instructionにprobeをしかける。とか出来るので、
エラーが発生した箇所を細かく絞り込むことが(根気が許せば)可能
- profile provideはトレース間隔に109とか4999とか変な数値がデフォルトになっているが、
キリのいい数字にすると毎回クロック割り込みとぶつかっておかしな集計結果になるから。
賢い
とりあえず、SystemTapも.SUNW_ldynsymをサポートして「でもstripされていたら行番号トレースはできないからね」という仕様にしたほうがLKMLでdisられなくなっていいんでは?とか思った
コメント
コメント一覧 (8)
ははは、鋭意努力いたしまする。。。(^^;
能動監視はkstat+perlで何とか
なりますが、アプリのお漏らしは
むずいので、やぱりイメージに
アタッチしてbpもどきがあると
楽ですね
またどこかでお会いしたらよろしくお願いします
nakajimak as hogerattan
(selfの主体は「このCPU」という意味?)
Aggregator(stapだとstatistics)の実装をスクリプト変換時に自動選択するのは、難しいことではないので、要求だせば作ってくれるかも。
ハッシュでTIDをキーにするケースって意外と多いんですよ。。。
引数がxxだったらフラグをONにしておいて、フラグがONだったら戻り値を記録みたいなケース。
んで、頻出だから専用の速い実装を用意してある。と
ん、まあSystemTapはコンパイラがリキ入っている系なので、コンパイラでがむばって解析すればいいのかもしれんけど。
高速に実装するとすれば、プロセス構造体の一部あるいはスタックの一部にローカルデータへのポインタを潜ませるのがいいかな(安全性はともかくとして(ぉぃ))。もしかするとutraceの拡張で何とかなるかもしれないなあと思ったり。
maxとかminとかcountとかは無条件で処理されるようですが。
んじゃ、SystemTapでaggregatorは遅いから使うなってのは過去のTipsになっているということかな。
今度速度計ってみます。