簡體   English   中英

使用 perf 監控原始事件計數器

[英]Using perf to monitor raw event counters

我正在嘗試在具有多個(物理)處理器的(英特爾至強)機器上測量某些硬件事件。 具體來說,我想知道為讀取“非核心”數據發出了多少請求。

我在英特爾文檔中找到了 OFFCORE_REQUESTS硬件事件,它給出了事件描述符 0xB0,對於數據需求,附加掩碼 0x01。

然后告訴 perf 記錄事件 0xB1 (即0xB0 | 0x01 )並將其稱為:

perf record -e r0B1 ./mytestapp someargs

或者這是不正確的? 因為性能perf report沒有顯示這樣輸入的事件的輸出。

除了沒有說明它是哪個事件的教程條目(盡管這個對我有用)或它是如何編碼的之外,該領域的 perf 文檔相當稀少...

任何幫助是極大的贊賞。

好的,所以我想我想通了。

對於我使用的 Intel 機器,格式如下: <umask><eventselector>其中兩者都是十六進制值。 可以刪除 umask 的前導零,但不能刪除事件選擇器。

因此,對於掩碼為0x01的事件0xB0 ,我可以調用:

perf record -e r1B0 ./mytestapp someargs

我無法在 perf 內核代碼中找到它的確切解析(這里有內核黑客嗎?),但我找到了這些來源:

  • c't 雜志 13/03(需要訂閱)中對 perf 與原始事件的使用的描述,其中描述了一些原始事件及其來自英特爾架構軟件開發人員手冊(第 3b 卷)的描述
  • 內核郵件列表上的補丁,討論記錄它的正確方法。 它指定上面的模式是“......特定於x86並且不完整”
  • (更新)較新版本的手冊頁顯示了 Intel 機器上的示例: man perf-list

更新:正如評論中指出的(謝謝!),可以使用 libpfm 轉換器來獲取正確的事件描述符。 用戶“osgx”發現的評論中鏈接的網站(Bojan Nikolic:如何監控 CPU 性能事件的全部范圍)對其進行了更詳細的解釋。

看來你也可以使用:

perf record -e cpu/event=0xB1,umask=0x1/u ./mytestapp someargs

我不知道這個語法記錄在哪里。

您也可以使用其他參數(edge、inv、cmask)。

有幾個庫可以幫助處理原始 PMU 事件。

perf 自己的 wiki https://perf.wiki.kernel.org/index.php/Tutorial#Events推薦perf list --help手冊頁以獲取有關原始事件編碼的信息。 現代 perf 版本將列出原始事件作為perf list輸出的一部分(“...如果鏈接到 libpfm4 庫,則提供對事件的一些簡短描述。”)。 perf list --details還將打印事件的原始 ID 和掩碼。

Bojan Nikolic 有“如何監控所有 CPU 性能事件”博客文章,內容涉及libpfm4 (perfmon2)庫使用showevtinfocheck_events工具為 perf 編碼原始事件,這些工具隨同一個庫提供。

還有 perf python 包裝器ocperf它接受英特爾的事件名稱。 它由 Andi Kleen(英特爾開源技術中心)編寫,作為pmu-tools 實用程序集的一部分( 2013 年的 LWN 帖子,英特爾在https://download.01.org/perfmon/ 上發布的事件列表)。 有一個 ocperf (2011) http://halobates.de/modern-pmus-yokohama.pdf的演示:

ocperf
•Perf wrapper to support Intel specific events
•Allows symbolic events and some additional events

    ocperf record -a −e offcore_response.any_data.remote_dram_0 sleep 10

PAPI 庫也有工具來探索帶有一些描述的原始事件 - papi_native_avail

暫無
暫無

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

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