[英]how to get rid of the “unknown” section in the perf
我所做的是:
1. sudo rm -rf /root/.debug/
2. compile program with -g -O2 -fno-omit-frame-pointer
3. run the program and get the pid
4. sudo perf record -F 2000 -a -s -g -p $pid sleep 15
5. sudo perf report
然后我得到一小部分“未知”,比如
- 2.50% 0.00% postgres [unknown] [k] 0000000000000000
- 0
1.12% _int_malloc ▒
0.79% _IO_vsnprintf
看起來這是由於 libc 'malloc' 調用。 然后我在同一台機器上編寫一個程序來測試它。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
while(1) {
printf("perf record -g -p %d -- sleep 5; perf report\n", getpid());
sleep(1);
void *p = malloc(10);
memset(p, 0, 10);
free(p);
}
return 0;
}
然后我做了和上面一樣的事情,沒有“未知”部分。
如何解釋/解決這個問題?
性能perf report
output 中的[unknown]
塊指的是動態共享 object ( DSO ) 的名稱。 perf report
無法解析DSO路徑,因此打印[unknown]
。 根據最新的 kernel 源代碼樹(撰寫本文時為 5.3.9),您可以在此處查看。
重要的是要知道 DSO 符號的確定是在采樣事件地址的幫助下發生的。 function thread__resolve負責執行此操作。 在較舊的內核中, thread__resolve
方法有另一個名稱 - perf_event__preprocess_sample_addr
。
鑒於您的 output 的快照,看起來在perf record
期間采樣的事件的地址為 0。這意味着該地址根本無法解析。 它是perf
空間中的地址(查看符號[k] 0000000000000000
),在您的情況下,性能無法解決。
注釋突出顯示將perf_event_paranoid
設置為合適的值,以便您可以成功探測 kernel 和用戶空間事件。 將perf_event_paranoid
設置為允許您正確探測 kernel 空間中的事件的值應該是正確解析地址的“一步”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.