簡體   English   中英

如何擺脫性能中的“未知”部分

[英]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.

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