8

Linuxperfを使用してC++アプリケーションのプロファイリングを行っており、GProf2dotを使用して優れた制御フローグラフを取得しています。ただし、Cライブラリ(libc6-2.13.so)の一部のシンボルは、合計時間のかなりの部分を占めますが、インエッジはありません。

例えば:

  • _int_malloc時間の8%かかりますが、親に電話をかけることはありません。
  • __strcmp_sse42一緒にすると__cxxabiv1::__si_class_type_info::__do_dyncast約10%の時間がかかり、名前が0、である発信者がいて、発信2d6935c者がいる、、、、2cc748cおよび発信6者がいない。

その結果、perfだけを使用して、このすべてのマロッキングと動的キャストの原因となっているルーチンを見つけることができません。ただし、他のシンボル(たとえばmalloc、ではない_int_malloc)には親の呼び​​出しがあるようです。

perfが_int_mallocの呼び出し親を表示しないのはなぜですか?__do_dyn_castの最終的な発信者が見つからないのはなぜですか?そして、この情報を取得できるようにセットアップを変更する方法はありますか?私はx86-64を使用しているので、フレームポインタを備えた(非標準の)libc6が必要かどうか疑問に思っています。

4

2 に答える 2

5

更新: 3.7.0カーネルの時点で、を使用してシステムライブラリ内のシンボルの呼び出し親を決定できますperf record -gdwarf <command>

を使用-gdwarfすると、でコンパイルする必要はありません-fno-omit-frame-pointer

元の回答:-fno-omit-framepointerはい、現時点では(2012年5月24日)、x86_64で フレームポインター()を使用してコンパイルされたlibc6が必要になる可能性があります。

ただし、開発者は現在、perfツールがDWARFアンワインド情報を使用できるようにすることに取り組んでいます。これは、x86_64のバックトレース情報を取得するためにフレームポインタが不要になったことを意味します。ただし、LinusはカーネルにDWARFアンワインダーを必要としません。したがって、perfツールは、システムの実行中にレジスターを保存し、libunwindライブラリーを使用してユーザースペースperfツールでDWARFアンワインドを実行します。

この手法は、(たとえば)mallocとの呼び出し元を正常に判別するためにテストされていdynamic_castます。ただし、パッチセットはまだLinuxカーネルに統合されていないため、準備が整う前にさらに改訂する必要があります。

于 2012-05-24T20:04:14.713 に答える
1

_int_malloc__do_dyn_castシンボルテーブル情報がないためにプロファイラーが識別できないルーチンから呼び出されています。

さらに、あなたは自己(排他的)時間を示しているように見えます。これは、a)自己時間が多く、b)修正できるルーチンのホットスポットを見つける場合にのみ役立ちます。

元のUNIXに続くプロファイラーprofilが作成されたのには理由があります。実際のソフトウェアは、ほぼすべての時間を他の関数の呼び出しに費やす関数で構成されており、プログラムカウンターがほとんどないのではなく、スタック上にあるコードを見つけることができる必要があります。

したがって、perfスタックサンプルを取得し、各ルーチンがスタック上にある時間の割合を通知するように構成する必要があります。Zoomのように、ルーチンだけでなくコード行も報告するとさらに便利です。IOを知らないように、実時間でサンプルを取得することをお勧めします。

これについては、まだまだ言いたいことがあります。

于 2012-04-20T12:58:53.933 に答える