ftrace() (またはその他のもの) を使用して、Linux カーネル内の特定のユーザー定義関数をトレースするにはどうすればよいですか? いくつかのマイクロベンチマークを作成して実行しようとしているので、特定の機能を実行するのに時間がかかるようにしたいと考えています。ドキュメントを(少なくともできる限り)読みましたが、正しい方向への一歩は素晴らしいでしょう。
私は ftrace() に傾倒していますが、Ubuntu 14.04 で動作させるのに問題があります。
ftrace() (またはその他のもの) を使用して、Linux カーネル内の特定のユーザー定義関数をトレースするにはどうすればよいですか? いくつかのマイクロベンチマークを作成して実行しようとしているので、特定の機能を実行するのに時間がかかるようにしたいと考えています。ドキュメントを(少なくともできる限り)読みましたが、正しい方向への一歩は素晴らしいでしょう。
私は ftrace() に傾倒していますが、Ubuntu 14.04 で動作させるのに問題があります。
使用しているカーネルのバージョンに応じて、いくつかのオプションがあります。
Systemtap - これは、stap に付属の例を確認する理想的な方法です。最小限の変更で何か準備ができている可能性があります。
oprofile - 古いバージョンのカーネルを使用している場合、stap は oprofile よりも精度が高くなります。
スタック トレーサ オプション付きのdebugfs - スタック オーバーランのデバッグに適しています。mounting debugfs
これを行うには、深度チェック機能をオンにし、次にをオンにする必要がありますecho 1 > /proc/sys/kernel/stack_tracer_enabled
。
strace - ユーザー空間プログラムによって呼び出されるシステム コールといくつかのパフォーマンス数値を特定する場合。使用するstrace -fc <program name>
お役に立てれば!
関数の実行時間が遅い/ブロックしている関数を補助的に呼び出すため、関数の実行時間が興味深い場合は、インストルメンテーション自体の「プローブ効果」オーバーヘッドによる過度の歪みなしに、ステートメントごとのトレースが機能する可能性があります。
probe kernel.statement("function_name@dir/file.c:*") { println(tid(), " ", gettimeofday_us(), " ", pn()) }
function_name 内の個々のステートメントのトレースが表示されます。隣接するステートメント間のデルタは、手動またはより大きなスクリプトで簡単に計算できます。https://sourceware.org/systemtap/examples/#profiling/linetimes.stpも参照してください
Ftrace は適切なオプションであり、優れたドキュメントがあります。
また、systemtap はあなたの状況で役立ちます。Systemtap は、スクリプト言語のようにコードを記述できるある種のツールです。これは非常に強力ですが、特定の関数の実行時間だけを知りたい場合は ftrace の方が適していますが、カーネル空間のパフォーマンスの問題などを分析するための非常に高度なツールが必要な場合は、非常に役立つ可能性があります。
Pls read more: (やりたいことはここにあります:- 5.2 タイミング機能の実行時間) ここにリンクの説明を入力してください
必要な精度 (CPU サイクル) を得るために、get_cycles()
基本的に RDTSC のラッパーである (ただしポータブル) を使用することになりました。ftrace() は将来的にも有益である可能性がありますが、現在私が行っているのは、開始 CPU サイクルと終了 CPU サイクルの差を取り、それをベンチマークとして使用することだけです。
更新: 命令の並列化を避けるために、実際には代わりに RDTSCP をラップすることになりました。RDTSC + CPUID を使用できませんでした。これは、ハイパーコールから多くの遅延が発生したためです (私は VM で作業しています)。
systemtap を使用して、次のスクリプトを試してください: https://github.com/openresty/stapx#func-latency-distr