10

まとめ:perf lockプロファイルは pthread_mutex ですか?

詳細

ツールperfにはオプションがありますperf lock。マニュアルページには次のように書かれています:

You can analyze various lock behaviours and statistics with this perf lock command.
   'perf lock record <command>' records lock events
    between start and end <command>. And this command
    produces the file "perf.data" which contains tracing
    results of lock events.

    'perf lock trace' shows raw lock events.

    'perf lock report' reports statistical data.

しかし、実行しようとするperf lock recordと、次のエラーが表示されましたinvalid or unsupported event: 'lock:lock_acquire'。私が見たところ、エラーはおそらくカーネルがCONFIG_LOCKDEPorでコンパイルされていないことが原因のようですCONFIG_LOCK_STAT

私の質問はperf lock、ユーザー空間ロック (pthread_mutex など) に関連するイベントを報告するのか、それともカーネル ロックのみを報告するのかということです。主にユーザー空間で実行されるアプリケーションのプロファイリングに興味があります。perf のこのオプションは面白そうだと思いましたが、新しいカーネルをコンパイル (または取得) しないと実行できないので、試す前にそれが何をするかをよりよく理解したいと思っています。

4

2 に答える 2

5

概要: perf はプロファイル pthread_mutex をロックしますか?

要約: いいえ、ユーザー空間 pthread_mutex にトレースポイントが定義されていないためです。

ソース ファイルtools/perf/builtin-lock.c( http://lxr.free-electrons.com/source/tools/perf/builtin-lock.c#L939 )によると、 (経由で)のいくつかのトレースポイントを定義し、オプションもに渡しcmd_lockます 。定義されたトレースポイントのリスト: :__cmd_recordperf record-e TRACEPOINT_NAME-R -m 1024 -c 1perf reportlock_tracepoints

842 static const struct perf_evsel_str_handler lock_tracepoints[] = {
843         { "lock:lock_acquire",   perf_evsel__process_lock_acquire,   }, /* CONFIG_LOCKDEP */
844         { "lock:lock_acquired",  perf_evsel__process_lock_acquired,  }, /* CONFIG_LOCKDEP, CONFIG_LOCK_STAT */
845         { "lock:lock_contended", perf_evsel__process_lock_contended, }, /* CONFIG_LOCKDEP, CONFIG_LOCK_STAT */
846         { "lock:lock_release",   perf_evsel__process_lock_release,   }, /* CONFIG_LOCKDEP */
847 };

TRACE_EVENT(lock_acquire,..で定義されてい trace/events/lock.hます。また trace_lock_acquire、kernel/locking/lockdep.c でのみ定義されています (debian コードベースで再確認してください: http://codesearch.debian.net/search?q=trace_lock_acquire )。によると、カーネルから CONFIG_LOCKDEP のみが欠落していますkernel/locking/Makefile: obj-$(CONFIG_LOCKDEP) += lockdep.o(トレースポイントはlockdep.c.

https://www.kernel.org/doc/Documentation/trace/tracepoints.txtによると、すべてのトレースポイントはカーネルのみであるため、perf lockユーザー空間のロックをプロファイルしません。

ユーザー空間のトレースポイントを宣言するプロジェクトである LTTng からトレースポイントを試すことができます ( http://lttng.org/ust )。ただし、準備完了のロック統計はなく、トレースポイントの生データのみです。また、マクロを使用してトレースポイントを定義する必要がありますtracef()(pthreads/glibc を再コンパイルするか、pthread の独自のラッパーを作成してみてください)。

于 2014-04-08T01:45:16.703 に答える