1

一定の間隔でスレッドの状態を覗いて、プログラムの実行全体に沿ってその状態を記録する必要があるとします。私はこれについてどのように考え始めるのかわかりません。任意のポインター (しゃれ?)? 私は Linux を使用してgccおりphreads、を使用しCており、通常のすべての Linux ツールにアクセスできます。基本的に、プログラムの実行中にスレッドが何らかの状態にあった時間を教えてくれる、スレッド用の単純なプロファイラーを構築する方法について質問していると思います。

Threadscope のようにグラフを作成できるようにしたいと考えています。X 軸は時間、Y 軸はコア/スレッド番号、「色」は状態です。緑は実行中、オレンジはガベージ コレクションなどです。これは今、より理にかなっていますか?

スレッドスコープ画像.

4

4 に答える 4

4

Linux 固有のソリューションについては、プロセスとスレッドの統計について、それぞれ と を/proc/<pid>/stat参照してください。そこにあるすべてのフィールドの完全な説明については、マニュアル ページを参照してください (オンライン/proc/<pid>/task/<tid>/stathttp://man7.org/linux/man-pages/man5/proc.5.html -検索)。具体的には、少なくともフィールドとはあなたが興味を持っています。これらは単調に増加する時間であるため、グラフのデータを生成するには、特定のタイム スライス中にプロセス/スレッドで費やされた時間を生成できるように、以前に測定された値を覚えておく必要があります。(これが仕組みです。)proc(5)/proc/[pid]/statcutimestimetop(1)

ただし、プロファイラーがさまざまな状態を区別するために、問題はより複雑になります。プロファイラーは、プロファイリングされたプログラムがどの状態にあるかをどのように区別しますか? プロファイリングされたプログラムスレッドは、何らかの方法でこれをプロファイラーに通知する必要があるようです。この状態を共有するには、何らかの調整されたソリューションが必要です (異なるスレッドで異なる状態を実行し、この方法で区別できる場合を除きますが、これは疑問です)。

状態遷移が 1 か所で行われる場合 (例: GC に入り、GCから出る)、1 つの方法は次のようになります。

  1. 監視対象のスレッドは、POSIX 関数を使用して特別な状態の開始時刻と終了時刻を取得clock_gettime()clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp)ます。プロセス時間とclock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp)スレッド時間を取得できます (どちらも単調に増加します)。
  2. スレッドは、ある種の IPC を使用して、これらのタイミングをプロファイラー プログラムに伝えることができます。
  3. プロファイラー アプリケーションは、状態に出入りするスレッド時間を認識している場合、測定スライスの変更時のスレッド時間の値を認識しているため、レポート タイム スライス内でレポートされた状態で費やされたスレッド時間の量を判断できます。 (そしてもちろん、ここでは状態の開始時間を次のレポート タイム スライスの開始と等しくなるように調整する必要があります)。
  4. プロセス全体が特定の状態で費やした時間は、その状態のスレッド時間を合計することで計算できます。

/proc/<pid>/statまたはを介し/proc/<pid>/task/<tid>/stat​​た測定精度はあまり良くないことに注意してください(クロックティック、多くの場合10ミリ秒単位)が、プロセス/スレッドの外部からタイミング情報を取得する他の方法を知りません。この関数clock_gettime()は非常に正確な時間を提供します (名目上はナノ秒の精度ですが、少なくとも一部の MIPS および ARM システムでは、Linux カーネル内のこれらのフィールドの正確なタイマー読み取りの実装が存在しないため、statファイルと同じくらい精度が悪いことに注意してください)。/procまた、(同じスレッドから両方の値を読み取ることによって) これら 2 つのタイミング ソースが実際に同じ結果をもたらすことを確認するために、いくつかの実験を行う必要があります。もちろんこちらも使えます/proc/.../statスレッド内のファイルですが、状態内で多くの時間を費やさない限り、精度はあまり良くありません。

于 2012-04-23T15:32:56.573 に答える
1

Haskell コンパイラによって生成され、Threadscope によって処理されるプロファイリング情報に直接一致するのは、C と GCC を使用したgprofユーティリティ (GNU binutils の一部) です。

pthread で正しく動作するには、各スレッドがタイマー初期化関数をトリガーする必要があります。これは、次の pthreads ラッパー ライブラリを使用してコードを変更せずに実行できます: http://sam.zoy.org/writings/programming/gprof.html。私は最近問題に対処していません。何かが変更され、ラッパーが不要になった可能性があります...

プロファイリング結果を解釈するための GUI としては、kprof (http://kprof.sourceforge.net) があります。残念ながら、それはスレッド期間グラフを生成しないため、gprof によって生成されたテキスト情報を使用して独自のソリューションを作成する必要があります。

GCC が提供する「標準」ソリューションの使用にこだわりがない場合は、これを試してみてください: http://code.google.com/p/gperftools/?redir=1 (個人的には試していませんが、良い意見を聞いた)。

幸運を!

于 2012-05-01T21:37:27.630 に答える
0

考慮しなければならないさまざまな要因があり、システムプロファイリングは本質的に複雑なタスクであり、マルチスレッドアプリケーションをプロファイリングする場合はさらに複雑になるため、単純なプロファイラーを構築するのはかなり難しいと思います。私が考えることができる最善のアドバイスは、OProfileなどの既存のものを調べることです。

OProfileの利点の1つは、オープンソースであるため、ソースコードが利用できることです。しかし、これを超えて、プロファイリングアプリケーションを構築する方法を尋ねることは、SOの質問で誰かが答えることができる範囲を超えている可能性があるため、この質問はあまり多くの回答を得ていないのではないかと思います。うまくいけば、いくつかの例を見ることがあなたが始めるのに役立つでしょう、そしておそらくあなたがより焦点を絞った質問をしているならあなたはいくつかのより詳細な回答を得ることができます。

于 2012-04-30T18:58:35.113 に答える
0

インテル VTune Amplifier XE (以前のインテル スレッド プロファイラー) を調べて、ニーズを満たすかどうかを確認してください。このツールおよびその他の Intel Linux 開発ツールは、非営利目的で無料で利用できます。

マルチスレッド・アプリケーションのタイムラインを示す インテル® VTune™ Amplifier XE でタイムラインを使用するビデオの 9:20 で、プレゼンターは次のように述べています。マークがタイムラインに表示されます。」

于 2012-04-28T20:02:42.130 に答える