簡體   English   中英

使用perf來獲取事件計數取決於其他事件的發生

[英]Using perf to get events counts depending on the occurrence of other events

是否有任何可能的方法可以根據其他事件的發生情況獲取事件計數器的值? 例如:如果我想在每次特定計數器達到特定值時知道性能計數器的值。

您可以使用perf_event_open執行此操作,但AFAIK不能直接使用當前版本的perf record

每當特定計數器達到特定值時,我想知道性能計數器的價值。

使用一組事件, “特定計數器”是組長。 對於此事件,您設置:

struct perf_event_attr leader;
leader.sample_type = PERF_SAMPLE_TIME | PERF_SAMPLE_READ;
leader.sample_period = specific_value;
// set type/config accordingly
leader.read_format = PERF_FORMAT_GROUP;
group_fd = syscall(__NR_perf_event_open, &leader, tid, cpu, -1, 0);
...

struct perf_event_attr other;
other.sample_period = 0; // doesn't trigger overflows
// set type/config accordingly
syscall(__NR_perf_event_open, &other, tid, cpu, group_fd, 0);

// do the mmap dance, ioctl etc. with the fd you get for the leader
// read values from both leader and other counters in your mmap buffer.

這不是一個偉大或完整的答案,但它對評論來說太大了。


IDK,如果可以使用perf實用程序本身,但理論上是的,你可以得到那些每次計數器溢出時觸發中斷的遺留事件(在可編程溢出計數;這就是事件采樣粒度的工作原理)。 然后,您可以從其他事件的計數器中讀取值。 可能使用與perf相同的API,您可以編寫從用戶空間執行此操作的代碼。

但是在x86上用於PEBS(精確事件) ,你可能不能,因為計數器溢出會將事件放入緩沖區而不是觸發中斷然后你可以做任意其他事情。 因此,如果您要使用的事件僅作為精確事件提供,那么您將需要針對最終問題的不同解決方案。

(關於中斷/異常的低級獎勵讀數,包括性能事件與PEBS: 當發生中斷時,管道中的指令會發生什么?


您可能想知道事件如何相互關聯。 如果您無法輕松實現,當一個溢出可能是XY問題時,想要對其他事件進行采樣。

perf record --timestamp將為每個事件添加時間戳。 這可能會為您提供了解您想要了解的內容所需的原始數據。 每隔1毫秒從PMU收集一個partiulcar過程的數據是相關的,並建議使用perf scriptperf record --all-cpus --timestamp的結果做一些事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM