女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux kernel系統(tǒng)性能優(yōu)化工具Perf介紹

xCb1_yikoulinux ? 來(lái)源:羽林君 ? 作者:良知猶存 ? 2022-04-15 12:17 ? 次閱讀

前言

之前有分享過(guò)自己工作中自己搭建的CPU監(jiān)控腳本等,但那個(gè)屬于是自己手工寫的一些腳本,比較粗淺的使用。后來(lái)就直接使用perf編譯到驅(qū)動(dòng)里面,在設(shè)備中直接使用perf了,比起自己寫的腳本,效率直線提升。今天就來(lái)分享以下perf的功能使用,它可以將消耗 CPU 時(shí)間比較大的用戶程序調(diào)用棧打印出來(lái),并生成火焰圖。

perf的介紹和安裝

Perf 是Linux kernel自帶的系統(tǒng)性能優(yōu)化工具。Perf的優(yōu)勢(shì)在于與Linux Kernel的緊密結(jié)合,它可以最先應(yīng)用到加入Kernel的new feature。pef可以用于查看熱點(diǎn)函數(shù),查看cashe miss的比率,從而幫助開(kāi)發(fā)者來(lái)優(yōu)化程序性能,也可以分析程序運(yùn)行期間發(fā)生的硬件事件,比如 instructions retired ,processor clock cycles 等;您也可以分析
軟件事件,比如 Page Fault 和進(jìn)程切換,這使得 Perf 擁有了眾多的性能分析能力,

通過(guò)它,應(yīng)用程序可以利用 PMU,tracepoint 和內(nèi)核中的特殊計(jì)數(shù)器來(lái)進(jìn)行性能統(tǒng)計(jì)。它不但可以分析指定應(yīng)用程序的性能問(wèn)題 (per thread),也可以用來(lái)分析內(nèi)核的性能問(wèn)題,當(dāng)然也可以同時(shí)分析應(yīng)用代碼和內(nèi)核,從而全面理解應(yīng)用程序中的性能瓶頸。

舉例來(lái)說(shuō),使用 Perf 可以計(jì)算每個(gè)時(shí)鐘周期內(nèi)的指令數(shù),稱為 IPC,IPC 偏低表明代碼沒(méi)有很好地利用 CPU。Perf 還可以對(duì)程序進(jìn)行函數(shù)級(jí)別的采樣,從而了解程序的性能瓶頸究竟在哪里等等。Perf 還可以替代 strace,可以添加動(dòng)態(tài)內(nèi)核 probe 點(diǎn),還可以做 benchmark 衡量調(diào)度器的好壞。。。

ubuntu安裝:

sudo apt-get install linux-tools-common linux-tools-"$(uname -r)" linux-cloud-tools-"$(uname -r)" linux-tools-generic linux-cloud-tools-generic

2056f8c0-bbe9-11ec-aa7f-dac502259ad0.png

安裝好之后使用perf -v命令查看版本

2067c966-bbe9-11ec-aa7f-dac502259ad0.png
在設(shè)備中安裝
如果你使用yocto,那么可是用bitbake perf 直接編譯perf工具出來(lái),然后做成鏡像燒錄到設(shè)備中,如果你使用的是其他根文件系統(tǒng)制作工具,方法也是類似。

2072fb74-bbe9-11ec-aa7f-dac502259ad0.png
將編譯好的的lib和bin目錄拷貝到設(shè)備中使用。

perf基本使用

它和Oprofile性能調(diào)優(yōu)工具等的基本原理都是對(duì)被監(jiān)測(cè)對(duì)象進(jìn)行采樣,最簡(jiǎn)單的情形是根據(jù) tick 中斷進(jìn)行采樣,即在 tick 中斷內(nèi)觸發(fā)采樣點(diǎn),在采樣點(diǎn)里判斷程序當(dāng)時(shí)的上下文。假如一個(gè)程序 90% 的時(shí)間都花費(fèi)在函數(shù) foo() 上,那么 90% 的采樣點(diǎn)都應(yīng)該落在函數(shù) foo() 的上下文中。運(yùn)氣不可捉摸,那么只要采樣頻率足夠高,采樣時(shí)間足夠長(zhǎng),那么以上推論就比較可靠。因此,通過(guò) tick 觸發(fā)采樣,我們便可以了解程序中哪些地方最耗時(shí)間,從而重點(diǎn)分析。

上面介紹了perf的原理,“根據(jù) tick 中斷進(jìn)行采樣,即在 tick 中斷內(nèi)觸發(fā)采樣點(diǎn),在采樣點(diǎn)里判斷程序當(dāng)時(shí)的上下文”,我們可以改變采樣的觸發(fā)條件使得我們可以獲得不同的統(tǒng)計(jì)數(shù)據(jù),例如 以時(shí)間點(diǎn) ( 如 tick) 作為事件觸發(fā)采樣便可以獲知程序運(yùn)行時(shí)間的分布;以 cache miss 事件觸發(fā)采樣便可以知道 cache miss 的分布,即 cache 失效經(jīng)常發(fā)生在哪些程序代碼中。如此等等。

首先我們可以看一下 perf 中能夠觸發(fā)采樣的事件有哪些。

perf list使用,可以列出所有的采樣事件

sudo perf list
2085ef22-bbe9-11ec-aa7f-dac502259ad0.png

可以看到 Hadrware event Software event等

  • Hardware Event 是由 PMU 硬件產(chǎn)生的事件,比如 cache 命中,當(dāng)您需要了解程序?qū)τ布匦缘氖褂们闆r時(shí),便需要對(duì)這些事件進(jìn)行采樣

  • Software Event 是內(nèi)核軟件產(chǎn)生的事件,比如進(jìn)程切換,tick 數(shù)等

  • Tracepoint event 是內(nèi)核中的靜態(tài) tracepoint 所觸發(fā)的事件,這些 tracepoint 用來(lái)判斷程序運(yùn)行期間內(nèi)核的行為細(xì)節(jié),比如 slab 分配器的分配次數(shù)等

perf stat 概覽程序的運(yùn)行情況

perf stat選項(xiàng),可以在終端上執(zhí)行命令時(shí)收集性能統(tǒng)計(jì)信息

sudo perf stat -p 11664
指定進(jìn)程查看,ctrl +c 殺死進(jìn)程之后,就可以看到相應(yīng)的數(shù)據(jù)了。
20a603fc-bbe9-11ec-aa7f-dac502259ad0.png

  • task-clock(msec)是指程序運(yùn)行期間占用了xx的任務(wù)時(shí)鐘周期,該值高,說(shuō)明程序的多數(shù)時(shí)間花費(fèi)在 CPU 計(jì)算上而非 IO

  • context-switches是指程序運(yùn)行期間發(fā)生了xx次上下文切換,記錄了程序運(yùn)行過(guò)程中發(fā)生了多少次進(jìn)程切換,頻繁的進(jìn)程切換是應(yīng)該避免的。(有進(jìn)程進(jìn)程間頻繁切換,或者內(nèi)核態(tài)與用戶態(tài)頻繁切換)

  • cpu-migrations 是指程序運(yùn)行期間發(fā)生了xx次CPU遷移,即用戶程序原本在一個(gè)CPU上運(yùn)行,后來(lái)遷移到另一個(gè)CPU

  • cycles:處理器時(shí)鐘,一條機(jī)器指令可能需要多個(gè) cycles

  • Instructions: 機(jī)器指令數(shù)目。

  • 其他可以監(jiān)控的譬如分支預(yù)測(cè)、cache命中,page-faults 是指程序發(fā)生了xx次頁(yè)錯(cuò)誤等

sudo  perf stat -p 13465
root@lyn:/mnt# ps -ux | grep target
root     13465 89.7  0.1   4588  1472 pts/1    R+   17:30   0:07 ./target
root     13467  0.0  0.0   3164   744 pts/0    S+   17:30   0:00 grep target
root@lyn:/mnt# perf stat -p 13465
^C
 Performance counter stats for process id '13465':

      13418.914783      task-clock (msec)         #    1.000 CPUs utilized          
                13      context-switches          #    0.001 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
                 0      page-faults               #    0.000 K/sec                  
       25072130385      cycles                    #    1.868 GHz                    
          20056061      stalled-cycles-frontend   #    0.08% frontend cycles idle   
        8663621265      stalled-cycles-backend    #   34.55% backend  cycles idle   
       27108898221      instructions              #    1.08  insns per cycle        
                                                  #    0.32  stalled cycles per insn
        3578980615      branches                  #  266.712 M/sec                  
            841545      branch-misses             #    0.02% of all branches        

      13.419173431 seconds time elapsed

參考鏈接

perf top實(shí)時(shí)顯示當(dāng)前系統(tǒng)的性能統(tǒng)計(jì)信息

sudo perf top -g

用于實(shí)時(shí)顯示當(dāng)前系統(tǒng)的性能統(tǒng)計(jì)信息。該命令主要用來(lái)觀察整個(gè)系統(tǒng)當(dāng)前的狀態(tài),比如可以通過(guò)查看該命令的輸出來(lái)查看當(dāng)前系統(tǒng)最耗時(shí)的內(nèi)核函數(shù)或某個(gè)用戶進(jìn)程。

20bbd18c-bbe9-11ec-aa7f-dac502259ad0.png

[.] : user level 用戶態(tài)空間,若自己監(jiān)控的進(jìn)程為用戶態(tài)進(jìn)程,那么這些即主要為用戶態(tài)的cpu-clock占用的數(shù)值
[k]: kernel level 內(nèi)核態(tài)空間
[g]: guest kernel level (virtualization) 客戶內(nèi)核級(jí)別
[u]: guest os user space 操作系統(tǒng)用戶空間
[H]: hypervisor 管理程序
The final column shows the symbol name.

當(dāng) perf 收集調(diào)用鏈時(shí),開(kāi)銷可以在兩列中顯示為Children和Self 。這里的Self列與沒(méi)有“-g”的列類似:這是每個(gè)函數(shù)花費(fèi)的 CPU 周期百分比。但是Children列在其下方添加了所有調(diào)用函數(shù)所花費(fèi)的時(shí)間。不僅是直系子女,而且是所有后代。對(duì)于調(diào)用圖的葉子,函數(shù)不調(diào)用其他任何東西,Self 和 Children 的值是相等的。但是對(duì)于 main(),它增加了在 f1()<-main() 和 f2()<-main() 中花費(fèi)的時(shí)間。您將第一行讀為:95.61% 的時(shí)間花在調(diào)用 main() 上,而只有 8.19% 的時(shí)間花在 main() 指令上,因?yàn)樗蟛糠謺r(shí)間都在調(diào)用其他函數(shù)。請(qǐng)注意,您可以添加“Self”以覆蓋 100%,但在“Children”中,兒童樣本占多行。這個(gè)想法是在頂部查看占樣本最多的調(diào)用堆棧片段。

有一個(gè)“+”,可以向下查看調(diào)用關(guān)系。

perf record 記錄采集的數(shù)據(jù)

使用 top 和 stat 之后,perf可能已經(jīng)大致有數(shù)了。要進(jìn)一步分析,便需要一些粒度更細(xì)的信息。比如說(shuō)我們已經(jīng)斷

使用 top 和 stat 之后,perf可能已經(jīng)大致有數(shù)了。要進(jìn)一步分析,便需要一些粒度更細(xì)的信息。比如說(shuō)我們已經(jīng)斷定目標(biāo)程序計(jì)算量較大,也許是因?yàn)橛行┐a寫的不夠精簡(jiǎn)。那么面對(duì)長(zhǎng)長(zhǎng)的代碼文件,究竟哪幾行代碼需要進(jìn)一步修改呢?這便需要使用 perf record 記錄單個(gè)函數(shù)級(jí)別的統(tǒng)計(jì)信息,并使用 perf report 來(lái)顯示統(tǒng)計(jì)結(jié)果(perf record表示記錄到文件,perf top直接會(huì)顯示到界面)。

perf record,它可以對(duì)事件進(jìn)行采樣,將采樣的數(shù)據(jù)收集在一個(gè) perf.data 的文件中,這將會(huì)帶來(lái)一定的性能開(kāi)銷,不過(guò)這個(gè)命令很有用,可以用來(lái)找出最占 CPU 的進(jìn)程。

下面的命令對(duì)系統(tǒng) CPU 事件做采樣,采樣時(shí)間為 60 秒,每秒采樣 99 個(gè)事件,-g表示記錄程序的調(diào)用棧。
sudoperf record -F 99 -a -g -- sleep 60

此外我們還可以使用PID監(jiān)控程序perf record -e cpu-clock -g-p pid監(jiān)控 已啟動(dòng)的進(jìn)程;也可以使用程序名監(jiān)控程序perf record -e cpu-clock -g -p grep your_program

-e選項(xiàng)允許您在perf list命令中列出的多個(gè)類別中選擇一個(gè)事件類別。例如,在這里,我們使用-e cpu-clock是指perf record監(jiān)控的指標(biāo)為cpu周期程序運(yùn)行完之后,perf record會(huì)生成一個(gè)名為perf.data的文件(缺省值),如果之前已有,那么之前的perf.data文件會(huì)變?yōu)閜erf.data.old文件

-g選項(xiàng)是告訴perf record額外記錄函數(shù)的調(diào)用關(guān)系,因?yàn)樵緋erf record記錄大都是庫(kù)函數(shù),直接看庫(kù)函數(shù),大多數(shù)情況下,你的代碼肯定沒(méi)有標(biāo)準(zhǔn)庫(kù)的性能好對(duì)吧?除非是針對(duì)產(chǎn)品進(jìn)行特定優(yōu)化,所以就需要知道是哪些函數(shù)頻繁調(diào)用這些庫(kù)函數(shù),通過(guò)減少不必要的調(diào)用次數(shù)來(lái)提升性能

perf record的其他參數(shù):

  • -f:強(qiáng)制覆蓋產(chǎn)生的.data數(shù)據(jù)

  • -c:事件每發(fā)生count次采樣一次

  • -p:指定進(jìn)程

  • -t:指定線程

可以使用ctrl+c中斷perf進(jìn)程,或者在命令最后加上參數(shù)--sleep n(n秒后停止)


  • sudo perf report -n可以生成報(bào)告的預(yù)覽。

  • sudo perf report -n --stdio可以生成一個(gè)詳細(xì)的報(bào)告。

  • sudo perf script可以 dump 出 perf.data 的內(nèi)容。

獲得這個(gè)perf.data文件之后,我們其實(shí)還不能直接查看,下面就需要perf report工具進(jìn)行查看

perf report輸出 record的結(jié)果

如果record之后想直接輸出結(jié)果,使用perf report即可
perf report的相關(guān)參數(shù):
-i : 指定文件輸出
-k:指定未經(jīng)壓縮的內(nèi)核鏡像文件,從而獲得內(nèi)核相關(guān)信息
--report:cpu按照cpu列出負(fù)載

sudo perf report

Samples: 123K of event 'cycles', Event count (approx.): 36930701307
Overhead  Command          Shared Object                                       Symbol
  18.91%  swapper          [kernel.kallsyms]                                   [k] intel_idle
     5.18%  dev_ui    libQt5lxxx                                    [.] 0x00000000013044c7
    3.20%  dev_ui             libc-2.19.so                                 [.] _int_malloc                                                                                                                                    
1.03%  dev_ui            libc-2.19.so                                  [.] __clock_gettime                                                                                                                                      
   3.04%  todesk           libpixman-1.so.0.38.4                               [.] 0x000000000008cac0
   1.20%  todesk           [JIT] tid 126593                                    [.] 0x0000000001307c7a
   0.84%  todesk           [JIT] tid 126593                                    [.] 0x000000000143c3f4
   0.73%  Xorg             i965_dri.so                                         [.] 0x00000000007cefe0
   0.65%  todesk           libsciter-gtk.so                                    [.] tool::tslice::xcopy
   0.58%  Xorg             i965_dri.so                                         [.] 0x00000000007cf00e
   0.53%  Xorg             i965_dri.so                                         [.] 0x00000000007cf03c
   0.49%  todesk           [JIT] tid 126593                                    [.] 0x0000000001307cb2
   0.48%  Xorg             i965_dri.so                                         [.] 0x00000000007cf06a
   0.44%  todesk           [JIT] tid 126593                                    [.] 0x0000000001307cb6
   0.41%  todesk           [JIT] tid 126593                                    [.] 0x0000000001307cc0
   0.40%  x-terminal-emul  libz.so.1.2.11                                      [.] adler32_z
   0.40%  todesk           [JIT] tid 126593                                    [.] 0x0000000001307c83
   0.38%  todesk           [JIT] tid 126593                                    [.] 0x0000000001307cbb
   0.33%  swapper          [kernel.kallsyms]                                   [k] menu_select
   0.32%  gnome-shell      libmutter-clutter-6.so.0.0.0                        [.] clutter_actor_paint
   0.31%  gnome-shell      libgobject-2.0.so.0.6400.6                          [.] g_type_check_instance_is_a
   0.31%  swapper          [kernel.kallsyms]                                   [k] psi_group_change
   0.24%  SDK_Timer-8      [kernel.kallsyms]                                   [k] psi_group_change
   0.24%  todesk           libc-2.31.so                                        [.] __memset_avx2_unaligned_erms
   0.18%  todesk           [JIT] tid 126593                                    [.] 0x00000000013044c7
   0.18%  todesk           [JIT] tid 126593                                    [.] 0x000000000143c3f0
   0.17%  gnome-shell      libglib-2.0.so.0.6400.6                             [.] g_hash_table_lookup
   0.17%  todesk           [JIT] tid 126593                                    [.] 0x000000000143c426
   0.17%  todesk           [JIT] tid 126593                                    [.] 0x000000000143c3dd
   0.16%  todesk           [JIT] tid 126593                                    [.] 0x000000000143c3d9
   0.16%  swapper          [kernel.kallsyms]                                   [k] cpuidle_enter_state
   0.16%  SDK_Timer-8      [kernel.kallsyms]                                   [k] syscall_exit_to_user_mode
   0.16%  swapper          [kernel.kallsyms]                                   [k] __sched_text_start

  • 在第二行我們發(fā)現(xiàn)一個(gè)dev_ui ,占用了5.18%,使用了libQt5lxxx庫(kù), 它本身功能UI顯示,,但是占用較高的CPU,說(shuō)明調(diào)用該庫(kù)存在問(wèn)題(代碼本身問(wèn)題),需要對(duì)調(diào)用該庫(kù)的代碼進(jìn)行檢查。

  • 第三行l(wèi)ibc-2.19.so [.] _int_malloc 這是常用的malloc操作,由于對(duì)代碼比較熟悉,在這個(gè)過(guò)程中不應(yīng)該有這么多次申請(qǐng)內(nèi)存,說(shuō)明代碼本身有問(wèn)題,需要對(duì)申請(qǐng)動(dòng)態(tài)內(nèi)存的代碼進(jìn)行檢查

  • 第四行行 __clock_gettime 這個(gè)是由于計(jì)時(shí)需要,需要頻繁獲取時(shí)間,通常是指 gettimeofday()函數(shù)

  • 整個(gè)統(tǒng)計(jì)顯示有很多task-clock占用是由于kernel.kallsyms導(dǎo)致,同時(shí)也驗(yàn)證了對(duì)perf stat獲得的數(shù)據(jù)的初步判斷,即CPU飆升也與頻繁的CPU遷移(內(nèi)核態(tài)中斷用戶態(tài)操作)導(dǎo)致,解決辦法是采用CPU綁核

也許有的人會(huì)奇怪為什么自己完全是一個(gè)用戶態(tài)的程序?yàn)槭裁催€會(huì)統(tǒng)計(jì)到內(nèi)核態(tài)的指標(biāo)?一是用戶態(tài)程序運(yùn)行時(shí)會(huì)受到內(nèi)核態(tài)的影響,若內(nèi)核態(tài)對(duì)用戶態(tài)影響較大,統(tǒng)計(jì)內(nèi)核態(tài)信息可以了解到是內(nèi)核中的哪些行為導(dǎo)致對(duì)用戶態(tài)產(chǎn)生影響;二則是有些用戶態(tài)程序也需要依賴內(nèi)核的某些操作,譬如I/O操作+ 4.93% dev_ui libcurl-gnutls.so.4.3.0 [.] 0x000000000001e1e0 ,左邊的加號(hào)代表perf已經(jīng)記錄了該調(diào)用關(guān)系,按enter鍵可以查看調(diào)用關(guān)系,perf監(jiān)控該進(jìn)程結(jié)果記錄到很多內(nèi)核調(diào)用,說(shuō)明該進(jìn)程在運(yùn)行過(guò)程中,有可能被內(nèi)核態(tài)任務(wù)頻繁中斷,應(yīng)盡量避免這種情況,對(duì)于這個(gè)問(wèn)題我的解決辦法是采用綁核,譬如機(jī)器有8個(gè)CPU,那么我就綁定內(nèi)核操作、中斷等主要在0-5CPU,GW由于有兩個(gè)線程,分別綁定到6、7CPU上。

注意:調(diào)優(yōu)應(yīng)該將注意力集中到百分比高的熱點(diǎn)代碼片段上,假如一段代碼只占用整個(gè)程序運(yùn)行時(shí)間的 0.1%,即使您將其優(yōu)化到僅剩一條機(jī)器指令,恐怕也只能將整體的程序性能提高 0.1%。俗話說(shuō),好鋼用在刀刃上.

參考文章:鏈接

也可以用關(guān)鍵詞篩選
使用了
sudo perf report可以查看當(dāng)前perf.data的數(shù)據(jù),但是當(dāng)你代碼調(diào)用很多時(shí)候不好進(jìn)行分析查看,這個(gè)時(shí)候我們就可以選擇我們需要關(guān)注的重點(diǎn)信息查看,提高效率。例如以下的futex_wait:
20cfea0a-bbe9-11ec-aa7f-dac502259ad0.png
選中之后,使用--call-graph ,,,,callee --symbol-filter =后面增加你需要篩選監(jiān)控的類型就可以單獨(dú)顯示了。

sudo perf report --call-graph ,callee –symbol-filter=futex_wait
20dbe2d8-bbe9-11ec-aa7f-dac502259ad0.png
這篇文章可以更多的幫助你理解filter:鏈接

perf diff進(jìn)行兩次record對(duì)比

我們多次perf record之后,當(dāng)前路徑下會(huì)有兩個(gè)perf.data 和perf.data.old文件,分別是本次和上次record的記錄,這個(gè)時(shí)候我們可以通過(guò)perf diff進(jìn)行對(duì)比優(yōu)化的結(jié)果。
20f39022-bbe9-11ec-aa7f-dac502259ad0.png
sudo perf diff perf.data perf.data.old

210487d8-bbe9-11ec-aa7f-dac502259ad0.png
介紹一些了perf細(xì)節(jié)使用的描繪,再給大家分享一個(gè)perf詳細(xì)使用介紹的網(wǎng)址,大家對(duì)于perf介紹中有需要繼續(xù)深入探索的部分,可以點(diǎn)擊以下鏈接進(jìn)行學(xué)習(xí)。

perf Examples詳細(xì)的使用介紹

鏈接:https://www.brendangregg.com/perf.html

211aad24-bbe9-11ec-aa7f-dac502259ad0.png

Linux Perf commands命令介紹使用
鏈接:https://linuxhint.com/linux-perf-commands/

212b8cc0-bbe9-11ec-aa7f-dac502259ad0.png

火焰圖的制作

CPU 的性能,它可以將消耗 CPU 時(shí)間比較大的用戶程序調(diào)用棧打印出來(lái),并生成火焰圖。通過(guò)分析火焰圖的頂層的顯示,我們就可以很直觀的查看我們函數(shù)的性能情況了。

這個(gè)是自己ubuntu20系統(tǒng)做捕獲的火焰圖顯示
213be426-bbe9-11ec-aa7f-dac502259ad0.png

  • x軸表示采樣次數(shù)或者頻率,如果一個(gè)函數(shù)在 x 軸占據(jù)的寬度越寬,就表示它被抽到的次數(shù)多,即執(zhí)行的時(shí)間長(zhǎng)。注意,x 軸不代表時(shí)間,而是所有的調(diào)用棧合并后,按字母順序排列的。

  • y 軸表示調(diào)用棧,每一層都是一個(gè)函數(shù)。調(diào)用棧越深,火焰就越高,頂部就是正在執(zhí)行的函數(shù),下方都是它的父函數(shù)。

火焰圖就是看頂層的哪個(gè)函數(shù)占據(jù)的寬度最大。只要有"平頂"(plateaus),就表示該函數(shù)可能存在性能問(wèn)題。

參考:鏈接1;鏈接2

具體步驟:

  • 1 首先,在 Ubuntu 安裝 perf 工具:

  • 2 再?gòu)膅ithub下載分析腳本
    git clone https://github.com/brendangregg/FlameGraph.git

  • 3 使用perf script工具對(duì)perf.data進(jìn)行解析
    perf script -i perf.data &> perf.unfold
    生成火焰圖通常的做法是將 perf.unfold 拷貝到本地機(jī)器,在本地生成火焰圖

  • 4 將perf.unfold中的符號(hào)進(jìn)行折疊
    FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded

  • 5 最后生成svg圖
    FlameGraph/flamegraph.pl perf.folded > perf.svg
    生成火焰圖可以指定參數(shù),–width 可以指定圖片寬度,–height 指定每一個(gè)調(diào)用棧的高度,生成的火焰圖,寬度越大就表示CPU耗時(shí)越多。

2157f3d2-bbe9-11ec-aa7f-dac502259ad0.png
:如果svg圖出現(xiàn)unknown函數(shù),使用如下命令

sudo perf record -e cpu-clock--call-graph dwarf-p pid

范例:perf record -e cpu-clock -g -p 29713 --call-graph dwarf使用–call-graph dwarf 之后record生成的perf.data很大,大家生成的時(shí)候要時(shí)刻注意設(shè)備剩余空間是否足夠

實(shí)際測(cè)試范例

如圖一段代碼
main -> do_main -> foo -> bar
其中 foo 函數(shù)和 bar 各有一個(gè)for循環(huán),用來(lái)表示代碼時(shí)間運(yùn)行消耗的cpu

#include 
#include 
#include 
#include 

using namespace std;
void bar(){
//   usleep(40*1000);
  /* do something here */
  for(int i=0;i< 4000;i++)
  {

  }
}

void foo(){
//   usleep(60*1000);
  for(int i=0;i< 5700;i++)
  {
      
  }      
  bar();
}

void do_main() {
  foo();
}

int main(int argc,char** argv){
    while(1)
    {
        do_main();
    }
}

運(yùn)行代碼之后進(jìn)行 top實(shí)時(shí)查看(因?yàn)槲业脑O(shè)備默認(rèn)都是sudo權(quán)限,所以以下命令都不用前綴sudo)

ps -xu | grep target

perf top -e cpu-clock -p 29713

發(fā)現(xiàn) foo 占用 60%cpu時(shí)間,而bar占用40%時(shí)間,和for循環(huán)展示的大致一樣
2162e5f8-bbe9-11ec-aa7f-dac502259ad0.png

perf record -e cpu-clock -g -p 29713

ctrl + c停止記錄,發(fā)現(xiàn)當(dāng)前目錄下保存了文件perf.data

使用report查看
perf report -i perf.data
217718f2-bbe9-11ec-aa7f-dac502259ad0.png

對(duì)比兩者差異,因?yàn)橹皇菃渭冇涗泝纱危a沒(méi)有修改,所以沒(méi)有差異
perf diff perf.data perf.data
218de0f0-bbe9-11ec-aa7f-dac502259ad0.png

perf script -i perf.data &> perf.unfold
219e6920-bbe9-11ec-aa7f-dac502259ad0.png
FlameGraph/stackcollapse-perf.pl test_data/perf.unfold &> test_data/perf.folded
21abfa04-bbe9-11ec-aa7f-dac502259ad0.png

拷貝到主機(jī)端進(jìn)行轉(zhuǎn)換成火焰圖
FlameGraph/flamegraph.pl test_data/perf.folded > test_data/perf.svg
21c36ca2-bbe9-11ec-aa7f-dac502259ad0.png

大家可以看到這個(gè)cpu占用關(guān)系,火焰圖的頂層是個(gè)大平層,說(shuō)明這段代碼cpu單個(gè)函數(shù)foo和bar占用率太高,這段代碼優(yōu)化空間很大。

結(jié)語(yǔ)

這就是我自己的一些perf使用分享。如果大家有更好的想法和需求,也歡迎大家加我好友交流分享哈。


作者:良知猶存,白天努力工作,晚上原創(chuàng)公號(hào)號(hào)主。公眾號(hào)內(nèi)容除了技術(shù)還有些人生感悟,一個(gè)認(rèn)真輸出內(nèi)容的職場(chǎng)老司機(jī),也是一個(gè)技術(shù)之外豐富生活的人,攝影、音樂(lè) and 籃球。關(guān)注我,與我一起同行。

原文標(biāo)題:perf性能分析工具使用分享

文章出處:【微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11033

    瀏覽量

    215978
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11459

    瀏覽量

    212773
  • 性能優(yōu)化
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    7505

原文標(biāo)題:perf性能分析工具使用分享

文章出處:【微信號(hào):yikoulinux,微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    全球最高性能RISC-V處理器的Perf性能分析工具發(fā)布

    日前,為配合高性能RISC-V處理器昉·天樞Dubhe應(yīng)用,賽昉科技發(fā)布了“賽昉科技Perf性能分析工具”。 ? Perf是基于
    的頭像 發(fā)表于 04-24 14:53 ?2107次閱讀
    全球最高<b class='flag-5'>性能</b>RISC-V處理器的<b class='flag-5'>Perf</b><b class='flag-5'>性能</b>分析<b class='flag-5'>工具</b>發(fā)布

    一文詳解Linuxperf_event

    Linux性能系統(tǒng)性能分析中非常有用。以下顯示了這篇文章中的perf系統(tǒng)componene
    發(fā)表于 10-11 09:04 ?2243次閱讀

    Linux系統(tǒng)性能分析之Perf命令

    在開(kāi)發(fā)板上使用apt安裝perf命令:
    發(fā)表于 07-14 15:24 ?1798次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)性能</b>分析之<b class='flag-5'>Perf</b>命令

    B4600A系統(tǒng)性能分析工具

    B4600A系統(tǒng)性能分析工具
    發(fā)表于 03-06 08:01

    AutoKernel高性能算子自動(dòng)優(yōu)化工具

    主要由資深HPC工程師(高性能計(jì)算優(yōu)化工程師)進(jìn)行開(kāi)發(fā),為了加快開(kāi)發(fā)進(jìn)程,縮短深度學(xué)習(xí)應(yīng)用落地周期,自動(dòng)化算子優(yōu)化是一個(gè)趨勢(shì)。AutoKernel是由OPEN AI LAB提出的高性能
    發(fā)表于 12-14 06:18

    優(yōu)化BIOS設(shè)置提高系統(tǒng)性能

    BIOS設(shè)置對(duì)系統(tǒng)性能的影響非常大,優(yōu)化的BIOS設(shè)置,可大大提高PC整體性能,不恰當(dāng)?shù)脑O(shè)置會(huì)導(dǎo)致系統(tǒng)性能下降,運(yùn)行不穩(wěn)定,甚至出現(xiàn)死機(jī)等現(xiàn)象。下面就BIOS中影響
    發(fā)表于 10-10 14:27 ?43次下載

    Xilinx SDK的系統(tǒng)性能分析工具介紹

    了解SDK中的系統(tǒng)性能分析工具,以對(duì)系統(tǒng)進(jìn)行建模,測(cè)量,分析和優(yōu)化。 SDK中的工具允許您對(duì)系統(tǒng)
    的頭像 發(fā)表于 11-27 06:04 ?4287次閱讀
    Xilinx SDK的<b class='flag-5'>系統(tǒng)性能</b>分析<b class='flag-5'>工具</b>技<b class='flag-5'>介紹</b>

    你知道perf學(xué)習(xí)-linux自帶性能分析工具怎么用?

    Linux性能調(diào)優(yōu)工具,32內(nèi)核以上自帶的工具,軟件性能分析。在2.6.31及后續(xù)版本的linux
    發(fā)表于 05-16 14:54 ?2748次閱讀

    賽昉科技發(fā)布Perf性能分析工具

    日前,為配合高性能RISC-V處理器昉·天樞Dubhe應(yīng)用,賽昉科技發(fā)布了“賽昉科技Perf性能分析工具”。  
    的頭像 發(fā)表于 04-24 15:48 ?2457次閱讀

    Linux性能分析工具perf詳解

    系統(tǒng)級(jí)性能優(yōu)化通常包括兩個(gè)階段:性能剖析(performance profiling)和代碼優(yōu)化。
    發(fā)表于 05-25 08:55 ?5353次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>性能</b>分析<b class='flag-5'>工具</b><b class='flag-5'>perf</b>詳解

    perf 在內(nèi)核中的實(shí)現(xiàn)原理

    我們?cè)凇兑晃目炊?b class='flag-5'>Linux性能分析|perf 原理》一文中介紹過(guò),perf 是基于采樣來(lái)對(duì)程序進(jìn)行分析的。采樣的步驟如下:
    的頭像 發(fā)表于 10-17 09:24 ?2837次閱讀

    全球最高性能RISC-V處理器的Perf性能分析工具發(fā)布

    日前,為配合高性能RISC-V處理器昉·天樞Dubhe應(yīng)用,賽昉科技發(fā)布了“賽昉科技Perf性能分析工具”。Perf是基于
    的頭像 發(fā)表于 04-25 10:51 ?1077次閱讀
    全球最高<b class='flag-5'>性能</b>RISC-V處理器的<b class='flag-5'>Perf</b><b class='flag-5'>性能</b>分析<b class='flag-5'>工具</b>發(fā)布

    Linux perf性能、實(shí)際應(yīng)用與案例

    Linux perf性能分析工具)是一個(gè)功能強(qiáng)大且靈活的性能剩余工具,它可以在
    發(fā)表于 07-03 10:22 ?882次閱讀

    如何使用perf性能分析工具

    放在一起,是內(nèi)核級(jí)的工具。perf是在Linux上做剖析分析的首選工具。 perf命令介紹
    的頭像 發(fā)表于 11-08 15:36 ?2185次閱讀
    如何使用<b class='flag-5'>perf</b><b class='flag-5'>性能</b>分析<b class='flag-5'>工具</b>

    Linux perf 簡(jiǎn)要介紹

    一、引言 (Introduction) 簡(jiǎn)要介紹Linux perf (Brief Introduction to Linux perf)
    的頭像 發(fā)表于 11-09 17:06 ?1185次閱讀