検索何Linuxで監視できますか?perf_events
何が見つかりませんかKernel PMU event
?つまり、次のようなperf version 3.13.11-ckt39
プログラムイベントがあります。perf list
branch-instructions OR cpu/branch-instructions/ [Kernel PMU event]
一般的に言えば、
Tracepoint event
Software event
Hardware event
Hardware cache event
Raw hardware event descriptor
Hardware breakpoint
Kernel PMU event
何か、どこから来たのか理解したいです。Kernel PMU event
プロジェクトを除くすべての人のための一種の説明があります。
~からパフォーマンス Wiki チュートリアルそしてブレンドン・グレグのページわかりました:
Tracepoints
最も明確なのは、モニタリングのためのプローブポイントを提供するカーネルソースコードのマクロであり、プロジェクトと共に導入され、ftrace
今誰もが使用していることです。Software
カーネルの低レベルカウンタと一部の内部データ構造です(したがってトレースポイントとは異なります)。Hardware event
以下に見つけることができる非常に基本的なCPUイベントがあります。みんなアーキテクチャであり、何とかカーネルに簡単にアクセスできます。Hardware cache event
ニックネームですRaw hardware event descriptor
。仕組みは次のとおりです。私が理解したところによると、
Raw hardware event descriptor
アーキテクチャ関連のイベントはより多くあります。Hardware event
これらのイベントはプロセッサモニタリングユニット(PMU)またはそのプロセッサの他の特定の機能で発生するため、特定のマイクロアーキテクチャでのみ使用できます(たとえば、「アーキテクチャ」と仮定)。 「は「x86_64」を意味し、残りの実装の詳細はすべて「マイクロアーキテクチャ」です。)これらの奇妙な記述子を介してアクセスできます。rNNN [Raw hardware event descriptor] cpu/t1=v1[,t2=v2,t3 ...]/modifier [Raw hardware event descriptor] (see 'man perf-list' on how to encode it)
- これらの記述子、その記述子が指すイベントなどは、プロセッサのマニュアル(perf wikiのPMUイベント);
しかし、人々が特定のプロセッサに役立つイベントがあることがわかったら、別名を付けて簡単に
Hardware cache event
アクセスできるようにLinuxに接続します。- 私が間違っている場合は訂正してください。 (奇妙なことに、これらすべては物理プロセッサのキャッシュに関するもの
Hardware cache event
です..)something-loads
something-misses
今
Hardware breakpoint
mem:<addr>[:access] [Hardware breakpoint]
ほとんどの最新アーキテクチャに共通するハードウェア機能であり、デバッガでブレークポイントとして使用できますか? (おそらくグーグルをしたようです)
最後に
Kernel PMU event
私はそれをGoogleで検索できませんでした。にも表示されませんブレンダン公演ページのイベント一覧では、これは新しいことですか?
おそらく、PMUで特別に提供されるハードウェアイベントの別名でしょうか? (簡単にアクセスできるように、イベントリストにニックネームに加えて別のセクションが
Hardware cache events
ありKernel PMU event
ます)。 (Hardware PMU event
そう呼びませんか?..)これは単に新しい命名体系(ハードウェアイベントの別名が分割されるもの)になるのでしょうか?cpu/mem-stores/
一部の Linux バージョンイベントは/sys/devices/
と で説明されているので、これらのイベントは、plus などを参照します。# find /sys/ -type d -name events /sys/devices/cpu/events /sys/devices/uncore_cbox_0/events /sys/devices/uncore_cbox_1/events /sys/kernel/debug/tracing/events
--for
debug/tracing
とftrace
トレースポイントの場合、他のディレクトリは表示されperf list
ているものと正確に一致しますKernel PMU event
。
誰かが私にシステムが何であるかについての良い説明/文書を提供できますかKernel PMU events
?そして、ハードウェアイベントなどを体系化する新たな努力が/sys/..events/
ありますか?/sys/..events/
(カーネルPMUは「カーネル性能監視装置」と同じです。)
ポリスチレン
より良いコンテキストを提供するには、許可されていない実行perf list
(表示されたトラッキングポイントはありませんが、1374のトラッキングポイントがすべてあります)を実行し、Kernel PMU event
sとsの完全なリストをスキップします。Hardware cache event
$ perf list
List of pre-defined events (to be used in -e):
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
...
cpu-clock [Software event]
task-clock [Software event]
...
L1-dcache-load-misses [Hardware cache event]
L1-dcache-store-misses [Hardware cache event]
L1-dcache-prefetch-misses [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
LLC-loads [Hardware cache event]
LLC-stores [Hardware cache event]
LLC-prefetches [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-store-misses [Hardware cache event]
iTLB-loads [Hardware cache event]
iTLB-load-misses [Hardware cache event]
branch-loads [Hardware cache event]
branch-load-misses [Hardware cache event]
branch-instructions OR cpu/branch-instructions/ [Kernel PMU event]
branch-misses OR cpu/branch-misses/ [Kernel PMU event]
bus-cycles OR cpu/bus-cycles/ [Kernel PMU event]
cache-misses OR cpu/cache-misses/ [Kernel PMU event]
cache-references OR cpu/cache-references/ [Kernel PMU event]
cpu-cycles OR cpu/cpu-cycles/ [Kernel PMU event]
instructions OR cpu/instructions/ [Kernel PMU event]
mem-loads OR cpu/mem-loads/ [Kernel PMU event]
mem-stores OR cpu/mem-stores/ [Kernel PMU event]
ref-cycles OR cpu/ref-cycles/ [Kernel PMU event]
stalled-cycles-frontend OR cpu/stalled-cycles-frontend/ [Kernel PMU event]
uncore_cbox_0/clockticks/ [Kernel PMU event]
uncore_cbox_1/clockticks/ [Kernel PMU event]
rNNN [Raw hardware event descriptor]
cpu/t1=v1[,t2=v2,t3 ...]/modifier [Raw hardware event descriptor]
(see 'man perf-list' on how to encode it)
mem:<addr>[:access] [Hardware breakpoint]
[ Tracepoints not available: Permission denied ]
ベストアンサー1
インターネット検索とack
終了!いくつかの答えがあります。
しかし、まず質問の目的を再び明確にします。システムの独立したプロセスとそのパフォーマンスカウンタを明確に区別したいと思います。たとえば、プロセッサのコア、非コアデバイス(最近の学習)、プロセッサのカーネルまたはユーザーアプリケーション、バス(=バスコントローラ)、ハードドライブは、すべてクロックによって同期されない独立したプロセスです。今日では、すべてプロセス監視カウンタ(PMC)が装備されています。カウンターがどのプロセスから出てくるのか知りたいです。 (これはインターネット検索にも役立ちます。物事の「サプライヤー」をよりよく確認できます。)
また、検索用機器: Ubuntu 14.04
、linux 3.13.0-103-generic
、プロセッサIntel(R) Core(TM) i5-3317U CPU @ 1.70GHz
( には/proc/cpuinfo
2つの物理コアと4つの仮想コアがあります。ここでは物理的な問題があります)。
質問に関連する用語、内容
インテルでは:
プロセッサは1つの
core
デバイス(1つのデバイス/プロセス)であり、複数のuncore
デバイスです。はcore
プログラム(クロック、ALU、レジスタなど)を実行することです。uncore
速度と低レイテンシを達成するために、プロセッサに近いチップに配置されたデバイスです(実際の理由は「メーカーができるから」です)。私が知っている限り、これは基本的にPCのマザーボードにあるようなノースブリッジにキャッシュを追加したものです。 AMDは実際にこれらのデバイスをノースブリッジinstead of
「ビコア」と呼びます。ubox
これは私sysfs
$ find /sys/devices/ -type d -name events /sys/devices/cpu/events /sys/devices/uncore_cbox_0/events /sys/devices/uncore_cbox_1/events
-
uncore
最後のレベルキャッシュ(LLC、RAMに達する前の最後のレベルキャッシュ)を管理するデバイス。したがって、2つのLLCと2つのコアがありますubox
。PMU(プロセッサモニタリングデバイス)は、プロセッサの動作を監視し、それをPMC(プロセッサモニタリングカウンタ)に書き込む別のデバイスです(キャッシュミス、プロセッササイクルなどの計算
core
)uncore
。 (PMC読み取り)コマンドを介してcore
アクセスrdpmc
されます。uncore
これらのデバイスは物理プロセッサに依存しているため、モデル固有のレジスタ(MSR)を介して(自然に)アクセスできますrdmsr
。明らかに、それらのワークフローはレジスタペアを介して実行されます。カウンタが計算する1つのレジスタセット、2つのレジスタはカウンタの値であり、1つではなく複数のイベントの後にインクリメントするように設定できます。これらのカウンタオーバーフローに気づく割り込み/技術があります。
詳細については、Intelの「IA-32ソフトウェア開発者マニュアルVol 3B」の第18章「パフォーマンスモニタリング」を参照してください。
また、「Architecture Performance Monitoring Version 1」バージョン
uncore
(マニュアルにバージョン1~4がありますが、どちらが私のプロセッサなのかわかりません)のこれらのPMCに対するMSRの具体的な形式は、「図18-1. レイアウト」IA32_PERFEVTSELx MSR」(マイページ18-3)および「18.2.1.2事前定義されたアーキテクチャパフォーマンスイベント」および「表18-1事前定義されたアーキテクチャパフォーマンスイベントのUMaskとイベント選択のコーディング」Hardware event
のセクションを示しますperf list
。
Linuxカーネルでは:
カーネルにはソフトウェア(カーネル)とハードウェアの両方でパフォーマンスカウンタを管理するためのシステム(抽象化/階層)があり、
linux-source-3.13.0/tools/perf/design.txt
このシステムのイベントはstruct perf_event_attr
(filelinux-source-3.13.0/include/uapi/linux/perf_event.h
)として定義され、その主な部分は次のとおりです。__u64 config
フィールド - CPU 固有のイベント定義 (インテル図に記載されている形式の 64 ビットワード) またはカーネルイベントを保持できます。構成語のMSBは、残りの部分に[raw CPUまたはカーネルイベント]が含まれているかどうかを示します。
カーネルイベントは、7ビットタイプと56ビットイベント識別子によって定義されます。
enum
私の場合、コードでは-sです。$ ak PERF_TYPE linux-source-3.13.0/include/ ... linux-source-3.13.0/include/uapi/linux/perf_event.h 29: PERF_TYPE_HARDWARE = 0, 30: PERF_TYPE_SOFTWARE = 1, 31: PERF_TYPE_TRACEPOINT = 2, 32: PERF_TYPE_HW_CACHE = 3, 33: PERF_TYPE_RAW = 4, 34: PERF_TYPE_BREAKPOINT = 5, 36: PERF_TYPE_MAX, /* non-ABI */
(私のエイリアスで、Debianの名前
ak
です。すごいです)。ack-grep
ack
ack
カーネルのソースコードでは、「システムで見つかったすべてのPMUを登録する」などの操作、および同様のものとして渡される
struct pmu
構造の種類を確認できますint perf_pmu_register(struct pmu *pmu, const char *name, int type)
。したがって、私たちはこのシステムを「カーネルのPMU」と呼ぶことができます。統合システムのPMU。ただし、この名前はカーネル操作を監視するシステムとして解釈される可能性があり、誤解を招く可能性があります。perf_events
明確にするために、このサブシステムを次のように指します。他のカーネルサブシステムと同様に、このシステムもエクスポートできます
sysfs
(ユーザーが使用できるようにカーネルサブシステムをエクスポートするためのものです)。events
エクスポート/sys/
された(部分?)サブシステムperf_events
上のディレクトリ。さらに、ユーザー空間ユーティリティ
perf
(Linuxに組み込まれています)はまだ別のプログラムであり、独自の抽象化を持っています。これは、ユーザーが監視を要求したイベントperf_evsel
(filelinux-source-3.13.0/tools/perf/util/evsel.{h,c}
)を表します。構造にはフィールドがありますが、struct perf_event_attr attr;
ユーティリティと同様のstruct cpu_map *cpus;
方法もあります。perf
全体または特定のCPUのフィールドにイベントを割り当てます。
回答
実際、これはキャッシュデバイス(インテルデバイス)
Hardware cache event
イベントへの「ショートカット」であり、プロセッサごとに異なり、プロトコルを介してアクセスできます。そして私が知っている限り、それはデバイスのイベント名を指定するので、アーキテクチャ内でより安定しています。私のカーネルには他のイベントやカウンターへの「ショートカット」はありません。残りはすべてカーネルイベントです。ubox
uncore
Raw hardware event descriptor
Hardware event
core
3.13
uncore
Software
Tracepoints
同じプロトコルを介して
core
アクセスされるかどうか疑問に思います。おそらくそうではありません。カウンタ/ PMUがオンになっているため、別の方法でアクセスされている可能性があります。たとえば、accessの代わりに適切なディレクティブを使用します。しかし、これはそれほど重要ではありません。Hardware event
Raw hardware event descriptor
core
rdpmu
rdmsr
uncore
Kernel PMU event
イベントのみsysfs
。kprobe
ただし、要点は、これらのイベントがHardware event
内部システムの他のイベントと同じであることですperf_event
。それが何であるかわかりません。
$ ls /sys/devices/uncore_cbox_0/events clockticks
はい。
詳細Kernel PMU event
コードを検索すると、次のようになります。
$ ak "Kernel PMU" linux-source-3.13.0/tools/perf/
linux-source-3.13.0/tools/perf/util/pmu.c
629: printf(" %-50s [Kernel PMU event]\n", aliases[j]);
- 関数で発生
void print_pmu_events(const char *event_glob, bool name_only) {
...
while ((pmu = perf_pmu__scan(pmu)) != NULL)
list_for_each_entry(alias, &pmu->aliases, list) {...}
...
/* b.t.w. list_for_each_entry is an iterator
* apparently, it takes a block of {code} and runs over some lost
* Ruby built in kernel!
*/
// then there is a loop over these aliases and
loop{ ... printf(" %-50s [Kernel PMU event]\n", aliases[j]); ... }
}
そしてperf_pmu__scan
同じファイルから:
struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu) {
...
pmu_read_sysfs(); // that's what it calls
}
- 同じファイルにもあります:
/* Add all pmus in sysfs to pmu list: */
static void pmu_read_sysfs(void) {...}
それはすべてです。
詳細Hardware event
とHardware cache event
明らかに、これはHardware event
IntelがIA-32 Software Developer Manual Volume 3Bの「事前定義されたアーキテクチャパフォーマンスイベント」、18.2.1.2と呼ぶことから来ています。マニュアルの「18.1 性能監視の概要」では、次のように説明します。
パフォーマンスモニタリング機能の2番目のカテゴリは、アーキテクチャパフォーマンスモニタリングと呼ばれます。このクラスは、同じ計算および割り込みベースのイベントサンプリングの使用法と、より少ない数の使用可能なイベントセットをサポートします。アーキテクチャパフォーマンスイベントの可視的な動作は、プロセッサの実装全体で一貫しています。 CPUID.0AH を使用してスキーマのパフォーマンス監視機能の可用性を列挙します。これらのイベントはセクション18.2で議論されています。
- 別のタイプは次のとおりです。
Intel Core Single-CoreおよびIntel Core Duoプロセッサから、パフォーマンス監視機能には2つのカテゴリがあります。最初のカテゴリは、計算または割り込みベースのイベントサンプリングを使用してパフォーマンスを監視するイベントをサポートします。これらのイベントはアーキテクチャには関係なく、プロセッサモデルによって異なります。
これらのイベントは実際には基本的な「生」ハードウェアイベントへのリンクであり、ユーティリティを介しperf
てRaw hardware event descriptor
。
これを確認するには、以下を確認してくださいlinux-source-3.13.0/arch/x86/kernel/cpu/perf_event_intel.c
。
/*
* Intel PerfMon, used on Core and later.
*/
static u64 intel_perfmon_event_map[PERF_COUNT_HW_MAX] __read_mostly =
{
[PERF_COUNT_HW_CPU_CYCLES] = 0x003c,
[PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0,
[PERF_COUNT_HW_CACHE_REFERENCES] = 0x4f2e,
[PERF_COUNT_HW_CACHE_MISSES] = 0x412e,
...
}
- 特に、0x412e
「LLC Misses」は、「表18-1。事前定義されたアーキテクチャパフォーマンスイベントのUMaskおよびイベント選択エンコード」にあります。
Bit Position CPUID.AH.EBX | Event Name | UMask | Event Select
...
4 | LLC Misses | 41H | 2EH
- はH
16進数を表します。 7つすべてが構造体にあります[PERF_COUNT_HW_REF_CPU_CYCLES] = 0x0300, /* pseudo-encoding *
。(名前は少し異なりますが、アドレスは同じです。)
次に、Hardware cache event
sの構造は次のようになります(同じファイル内)。
static __initconst const u64 snb_hw_cache_extra_regs
[PERF_COUNT_HW_CACHE_MAX]
[PERF_COUNT_HW_CACHE_OP_MAX]
[PERF_COUNT_HW_CACHE_RESULT_MAX] =
{...}
——砂橋にはどれを使うべきですか?
そのうちの1つであるsnb_hw_cache_extra_regs[LL][OP_WRITE][RESULT_ACCESS]
--fillはSNB_DMND_WRITE|SNB_L3_ACCESS
上記のdef-sに由来しています。
#define SNB_L3_ACCESS SNB_RESP_ANY
#define SNB_RESP_ANY (1ULL << 16)
#define SNB_DMND_WRITE (SNB_DMND_RFO|SNB_LLC_RFO)
#define SNB_DMND_RFO (1ULL << 1)
#define SNB_LLC_RFO (1ULL << 8)
同じでなければなりません0x00010102
が、一部のテーブルでこれを確認する方法がわかりません。
これはどのように使用できるかについてのアイデアを提供しますperf_events
。
$ ak hw_cache_extra_regs linux-source-3.13.0/arch/x86/kernel/cpu/
linux-source-3.13.0/arch/x86/kernel/cpu/perf_event.c
50:u64 __read_mostly hw_cache_extra_regs
292: attr->config1 = hw_cache_extra_regs[cache_type][cache_op][cache_result];
linux-source-3.13.0/arch/x86/kernel/cpu/perf_event.h
521:extern u64 __read_mostly hw_cache_extra_regs
linux-source-3.13.0/arch/x86/kernel/cpu/perf_event_intel.c
272:static __initconst const u64 snb_hw_cache_extra_regs
567:static __initconst const u64 nehalem_hw_cache_extra_regs
915:static __initconst const u64 slm_hw_cache_extra_regs
2364: memcpy(hw_cache_extra_regs, nehalem_hw_cache_extra_regs,
2365: sizeof(hw_cache_extra_regs));
2407: memcpy(hw_cache_extra_regs, slm_hw_cache_extra_regs,
2408: sizeof(hw_cache_extra_regs));
2424: memcpy(hw_cache_extra_regs, nehalem_hw_cache_extra_regs,
2425: sizeof(hw_cache_extra_regs));
2452: memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs,
2453: sizeof(hw_cache_extra_regs));
2483: memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs,
2484: sizeof(hw_cache_extra_regs));
2516: memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, sizeof(hw_cache_extra_regs));
$
smemcpy
はで完了しました__init int intel_pmu_init(void) {... case:...}
。
少しattr->config1
変です。しかし、perf_event_attr
(同じlinux-source-3.13.0/include/uapi/linux/perf_event.h
ファイル)があります。
...
union {
__u64 bp_addr;
__u64 config1; /* extension of config */
};
union {
__u64 bp_len;
__u64 config2; /* extension of config1 */
};
...
perf_events
(で定義)を呼び出してint perf_pmu_register(struct pmu *pmu, const char *name, int type)
カーネルシステムに登録されますlinux-source-3.13.0/kernel/events/core.c:
。
static int __init init_hw_perf_events(void)
(ファイルarch/x86/kernel/cpu/perf_event.c
)と通貨perf_pmu_register(&pmu, "cpu", PERF_TYPE_RAW);
static int __init uncore_pmu_register(struct intel_uncore_pmu *pmu)
(ファイルarch/x86/kernel/cpu/perf_event_intel_uncore.c
、またarch/x86/kernel/cpu/perf_event_amd_uncore.c
)呼び出しを含むret = perf_pmu_register(&pmu->pmu, pmu->name, -1);
結局のところ、すべてのイベントはハードウェアで発生し、すべてがうまくいきました。しかし、ここで私たちはなぜLLC-loads
inperf list
とnotを持っているのかを知ることができます。ubox1 LLC-loads
これはハードウェアイベントであり、実際にubox
esで発生するためです。
perf
ユーティリティとその構造の内容は次のとおりですperf_evsel
。ハードウェアイベントを要求するときにそのイベントを取得するプロセッサを定義し(デフォルトはすべて)、要求されたイベントとプロセッサに設定し、集計するときにすべてのプロセッサのperf
カウンタperf_evsel
を合計しますperf_evsel
(またはそれに関する他の統計を実行します)。
人々は以下から見ることができますtools/perf/builtin-stat.c
。
/*
* Read out the results of a single counter:
* aggregate counts across CPUs in system-wide mode
*/
static int read_counter_aggr(struct perf_evsel *counter)
{
struct perf_stat *ps = counter->priv;
u64 *count = counter->counts->aggr.values;
int i;
if (__perf_evsel__read(counter, perf_evsel__nr_cpus(counter),
thread_map__nr(evsel_list->threads), scale) < 0)
return -1;
for (i = 0; i < 3; i++)
update_stats(&ps->res_stats[i], count[i]);
if (verbose) {
fprintf(output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
perf_evsel__name(counter), count[0], count[1], count[2]);
}
/*
* Save the full runtime - to allow normalization during printout:
*/
update_shadow_stats(counter, count);
return 0;
}
(したがって、ユーティリティにとってperf
「シングルカウンタ」はそれでもなく、perf_event_attr
ソフトウェアイベントとハードウェアイベントの両方に適した一般的な形式であり、クエリするイベントです。同じイベントが別のデバイスから来て再集計されました。)
注:struct perf_evsel
1つだけが含まれていますが、struct perf_evevent_attr
フィールドも含まれていますstruct perf_evsel *leader;
。入れ子になっています。 「(階層的)イベントグループ」には、perf_events
複数のカウンタをまとめて派遣し、互いに比較する機能があります。kernel
、、のcore
独立したイベントをどのように処理するのかわかりませんubox
。しかし、今回のネストはそれがすべてですperf_evsel
。おそらく、これはperf
複数のイベントに対するクエリが管理される方法です。