問題タブ [perf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 'perfrecord'を使用したサンプルプロファイリングの設定レート
私が理解しているように、Linuxのパフォーマンスカウンターサブシステムは、perf record
コマンドを使用して、CPUおよびハードウェアカウンター(キャッシュミスなど)のサンプルベースのプロファイリングを実行します。
のサンプリングレートをどのように指定します
perf record
か?マニュアルページからわかる最も近いものは、やや不可解なオプション「-c、-count =サンプリングするイベント期間」ですが、これが期間としての期間を指しているのか、レート期間の逆を指しているのかは明確ではありません。 (後者の場合、どのユニットが期待されるか)。モバイルAndroidデバイス上のアプリケーションでサンプリングするための「適切な」サンプリングレートとは何ですか?どのレートが低すぎて役に立たないのか、そしてどのレートが高すぎるのか?
c++ - Linux perf: ホットスポットを解釈して見つける方法
今日、Linux のperfユーティリティを試してみましたが、結果の解釈に問題があります。私は valgrind の callgrind に慣れていますが、これはもちろん、サンプリング ベースの perf メソッドとはまったく異なるアプローチです。
私がしたこと:
今、私はこのようなものを見ます:
これらの関数は遅いかもしれませんが、どこから呼び出されているかを知るにはどうすればよいでしょうか? これらのホットスポットはすべて外部ライブラリにあるため、コードを最適化する方法がわかりません。
基本的に、累積コストで注釈が付けられたある種のコールグラフを探しています。ここで、関数は、呼び出したライブラリ関数よりも包括的なサンプリング コストが高くなります。
これはperfで可能ですか?もしそうなら - どのように?
注:「E」はコールグラフをアンラップし、より多くの情報を提供することがわかりました。しかし、コールグラフは多くの場合、十分に深くないか、どこでどれだけの情報が費やされたかに関する情報を提供せずにランダムに終了します。例:
64ビットで実行していることが問題になる可能性はありますか? http://lists.fedoraproject.org/pipermail/devel/2010-November/144952.htmlも参照してください(私は fedora を使用していませんが、すべての 64 ビット システムに適用されるようです)。
linux - perf を使用した Linux 2.6.32 FIFO リアルタイム スケジューラのプロファイリング
特定の実行期間中にリアルタイムのパフォーマンスを必要とする組み込みアプリケーションに取り組んでいます。
への呼び出しで、アプリケーションの優先度を約 150 ミリ秒エスカレートします。
sched_setscheduler( 0, SCHED_FIFO, &s ) ここで、s.sched_priority = sched_get_priority_max(SCHED_FIFO) であり、99 を返します。
その後、次の呼び出しでアプリケーションのスケジューリング優先度を下げます
sched_setscheduler( 0, SCHED_OTHER, &s ) ここで、s.sched_priority = sched_get_priority_min(SCHED_OTHER) です。
このスケジューラの優先順位のエスカレーション/エスカレーション解除は、1 秒ごとに発生します。
断続的なリアルタイムの締め切りに間に合わないことが、アプリケーション内で明らかになりました。スケジューラーをプロファイリングして、リアルタイム実行期間がプリエンプトされているかどうかを判断したいと考えています。
perf sched record -r 99 -R ./test_app
[パフォーマンス レコード: データを書き込むために 9 回起きた] [パフォーマンス レコード: 10.272 MB の perf.data (~448808 サンプル) をキャプチャして書き込みました]
私が探しているのは、99 の優先度値を参照して、私のアプリケーションに関連付けられた sched_switch イベントです。私のアプリケーションは優先度を n 回エスカレートする必要があると判断できるため、そのようなイベントが n 個以上見つかった場合、それは実行のリアルタイム部分がプリエンプトされていることを意味します。
次のコマンドを使用すると、大量のスケジューラ データが stdout に送信されます。
パフォーマンス スケジュール トレース | grep test_app | grep sched_switch
次のように優先度 99 に言及しているスケジューラ切り替えイベントを見つけることを期待していました。
パフォーマンス スケジュール トレース | grep test_app | grep sched_switch | grep prio=99
それでも、上記のコマンドは何も返しません。
perf バージョン 0.0.2.PERF を使用しています。perf の動作または使用に関して間違った仮定をしていませんか? もしそうなら、Linuxリアルタイムスケジューラのプロファイリングに代わる正しい使用法またはその他の方法を提案してください。
linux-kernel - perf record: 複数のイベントを指定して、それぞれに異なる sample-after 値を使用できますか
Linux カーネル パッケージの perf ツールを使用して、いくつかの生の PMU イベントを測定しようとしています。perf-record のマンページには、「-l」オプション (スケール カウンター値) があります。これは、サンプル カウントだけでなく、合計カウンター値を知りたいので、私の場合に役立ちます。ただし、-l が認識されないようですが、これは予想されることですか? 合計数を取得するにはどうすればよいですか?
もう 1 つの質問は、どうすれば複数のイベントを指定し、それぞれに異なる sample-after 値を使用できるかということです。perf レコードのように -c 10000,2000000,2000000 -e r2d4,r03c,r0c0
ありがとうございました
ubuntu - perf annotate が常に出力を提供するとは限らない
Linuxでperfツールを使用しています。通常、「perf annotate」を実行しても出力が得られません。. 「perf report」を実行すると、必要なレポートが得られます。
コードの注釈出力を 1 回だけ正常に取得できました。そして今、空白の出力が表示され続けます。
それとは別に、perf を実際にインストールできなかったので、make を実行したところ、./perf? を実行できました。これは問題の原因になりますか?
教えていただけますか?
ありがとうございました
c++ - Linux perfでlibc6シンボル(例:_int_malloc)の親を呼び出すにはどうすればよいですか?
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が必要かどうか疑問に思っています。
linux - perf.data ファイルから perf-stat の結果を生成できますか?
Linux ツール スイートperfの perf-stat と perf-report を使用してパフォーマンス レポートを生成する場合は、次のコマンドを実行します。
と:
しかし、それは 'myCmd' をもう一度実行することを意味します。これには数分かかります。代わりに、私は次のことを望んでいました:
しかし、perf スイートのほとんどのツールとは異なり、perf-stat には -i オプションがありません。このための別のツール、または perf-report を取得して perf-stat と同様の出力を生成する方法はありますか?
linux - 自分のプログラムでシンボルを見つけるために perf を取得するにはどうすればよいですか
を使用するperf report
と、プログラムのシンボルが表示されず、代わりに次のような出力が得られます。
これはかなり有益ではありません。
関連するプログラムはデバッグ シンボルを使用してビルドされており、sysprof
ツールは適切なシンボルを表示します。Zoom は内部で使用されていると思いますperf
。
これは x86-64 上にあるため、バイナリは でコンパイルされ-fomit-frame-pointer
ますが、他のツールで実行する場合も同様です。
linux - 条件付きジャンプのカウント
ちょっと初心者っぽい質問があります。私はLinuxにまったく慣れていません。
プログラムが実行した条件付きジャンプの数 (つまり、プログラムが実行した if() や while() などの数) を数えたいと思います。
perf でこれを行うことができると言われ、それを読みましたが、完全に迷っています。
誰か教えてくれませんか?たとえば、次のような C++ プログラムがあります。
このコードが tmp というファイルにコンパイルされているとします。
以下を発行してみました。
しかし、取得するブランチの数は毎回異なります。
私は何か間違ったことをしていますか?
編集:ソースコードが利用できないと仮定していることに言及する必要があります。だから私はバイナリを見ています。
linux-kernel - perfuserlandツールとPEBSを使用したイベントベースのサンプリング
私はperfuserlandツールを使用してイベントベースのサンプリングを行っています。目的は、作業中の大規模なシステムで、ブランチミスやキャッシュミスなどのパフォーマンスに影響を与える特定のイベントが発生している場所を特定することです。
さて、
完全に機能します。「pp」修飾子によってトリガーされるPEBSカウントモードは、サンプルでIPを収集するときに非常に正確です。
残念ながら、キャッシュミスに対して同じことをしようとすると、
私は得る
エラー:sys_perf_event_open()システムコールが22(無効な引数)で返されました。/ bin/dmesgは追加情報を提供する場合があります。
致命的:CONFIG_PERF_EVENTS = yカーネルサポートが構成されていませんか?
dmesg | grep "perf\|pmu"
有用なAFAICTは何も示していません。[1]と[1]の両方があるため、カーネルがCONFIG_PERF_EVENTS=yでコンパイルされたこともかなり確信しています。
仕事:[2]の問題は、収集されたサンプルがあまり正確ではなく、私のプロファイルを傷つけることです。
ここで何が起こっているのかについてのヒントはありますか?