Linux 固有のソリューションについては、プロセスとスレッドの統計について、それぞれ と を/proc/<pid>/stat
参照してください。そこにあるすべてのフィールドの完全な説明については、マニュアル ページを参照してください (オンライン/proc/<pid>/task/<tid>/stat
http://man7.org/linux/man-pages/man5/proc.5.html -検索)。具体的には、少なくともフィールドとはあなたが興味を持っています。これらは単調に増加する時間であるため、グラフのデータを生成するには、特定のタイム スライス中にプロセス/スレッドで費やされた時間を生成できるように、以前に測定された値を覚えておく必要があります。(これが仕組みです。)proc(5)
/proc/[pid]/stat
cutime
stime
top(1)
ただし、プロファイラーがさまざまな状態を区別するために、問題はより複雑になります。プロファイラーは、プロファイリングされたプログラムがどの状態にあるかをどのように区別しますか? プロファイリングされたプログラムスレッドは、何らかの方法でこれをプロファイラーに通知する必要があるようです。この状態を共有するには、何らかの調整されたソリューションが必要です (異なるスレッドで異なる状態を実行し、この方法で区別できる場合を除きますが、これは疑問です)。
状態遷移が 1 か所で行われる場合 (例: GC に入り、GCから出る)、1 つの方法は次のようになります。
- 監視対象のスレッドは、POSIX 関数を使用して特別な状態の開始時刻と終了時刻を取得
clock_gettime()
しclock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp)
ます。プロセス時間とclock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp)
スレッド時間を取得できます (どちらも単調に増加します)。
- スレッドは、ある種の IPC を使用して、これらのタイミングをプロファイラー プログラムに伝えることができます。
- プロファイラー アプリケーションは、状態に出入りするスレッド時間を認識している場合、測定スライスの変更時のスレッド時間の値を認識しているため、レポート タイム スライス内でレポートされた状態で費やされたスレッド時間の量を判断できます。 (そしてもちろん、ここでは状態の開始時間を次のレポート タイム スライスの開始と等しくなるように調整する必要があります)。
- プロセス全体が特定の状態で費やした時間は、その状態のスレッド時間を合計することで計算できます。
/proc/<pid>/stat
またはを介し/proc/<pid>/task/<tid>/stat
た測定精度はあまり良くないことに注意してください(クロックティック、多くの場合10ミリ秒単位)が、プロセス/スレッドの外部からタイミング情報を取得する他の方法を知りません。この関数clock_gettime()
は非常に正確な時間を提供します (名目上はナノ秒の精度ですが、少なくとも一部の MIPS および ARM システムでは、Linux カーネル内のこれらのフィールドの正確なタイマー読み取りの実装が存在しないため、stat
ファイルと同じくらい精度が悪いことに注意してください)。/proc
また、(同じスレッドから両方の値を読み取ることによって) これら 2 つのタイミング ソースが実際に同じ結果をもたらすことを確認するために、いくつかの実験を行う必要があります。もちろんこちらも使えます/proc/.../stat
スレッド内のファイルですが、状態内で多くの時間を費やさない限り、精度はあまり良くありません。