專題:性能調優之工具---perf


1. Linux Perf簡介

1.1 Perf是什么

Perf 是內置於Linux 內核源碼樹中的性能剖析(profiling)工具。它基於事件采樣原理,以性能事件為基礎,支持針對處理器相關性能指標與操作系統相關性能指標的性能剖析。可用於性能瓶頸的查找與熱點代碼的定位。linux2.6及后續版本都自帶該工具,幾乎能夠處理所有與性能相關的事件。

1.2 性能事件

性能事件指在處理器或者操作系統中發生,可能影響到程序性能的硬件事件或者軟件事件。

1.3 主要作用

Perf工具可用來對軟件進行優化,包括算法優化(空間復雜度、時間復雜度)和代碼優化(提高執行速度、減少內存占用)。還可以評估程序對硬件資源的使用情況,例如各級cache的訪問次數,各級cache的丟失次數、流水線停頓周期、前端總線訪問次數等。也可以評估程序對操作系統資源的使用情況,系統調用次數、上下文切換次數、任務遷移次數等。

1.4 perf 安裝

1.4.1 利用源碼安裝

下載一份2.6版本以后的linux源碼,網址(https://www.kernel.org/)

在linux/tools/perf目錄中執行命令,make--->make install,在usr1/用戶名/bin下會有個perf命令。

1.4.2 利用軟件包安裝

……,網上的各種安裝方法感覺都不好使,還是用源碼來的方便快捷。

以上為linux下的perf的基本原理和工作流程

2.Perf基本原理

Perf主要基於性能事件的采集和分析,有兩種采集方法:

基於硬件的采集方法,此種方法需要采用CPU中的PMU(performance monitoring unit)部件,在特定的條件下探測性能事件是否發生以及發生的次數。

基於軟件的采集方法,需要將代碼內置於kernel,分布在各個功能模塊中,統計和操作系統相關性能事件。

那么perf 是怎么做到的呢?首先,perf 會通過系統調用sys_perf_event_open在內核中注冊一個監測“cycles”事件的性能計數器。內核根據perf 提供的信息在PMU 上初始化一個硬件性能計數器(PMC: Performance Monitoring Counter)。PMC隨着CPU 周期的增加而自動累加。在PMC溢出時,PMU 觸發一個PMI(Performance Monitoring Interrupt)中斷。內核在PMI 中斷的處理函數中保存PMC的計數值,觸發中斷時的指令地址(Register IP:Instruction Pointer),當前時間戳以及當前進程的PID,TID,comm 等信息。我們把這些信息統稱為一個采樣(sample)。內核會將收集到的sample 放入用於跟用戶空間通信的Ring Buffer。

用戶空間里的perf 分析程序采用mmap 機制從ring buffer 中讀入采樣,並對其解析。perf 根據pid,comm 等信息可以找到對應的進程。根據IP 與ELF 文件中的符號表可以查到觸發PMI 中斷的指令所在的函數。為了能夠使perf 讀到函數名,我們的目標程序必須具備符號表。如果讀者在perf 的分析結果中只看到一串地址,而沒有對應的函數名時,通常是由於在編譯時利用strip 刪除了ELF 文件中的符號表。建議讀者在性能分析階段,保留程序中的symbol table,debug info等信息。【1】

2.1 Perf硬件采樣原理

Perf硬件采樣主要利用了CPU中的PMU部件。接下來為大家介紹PMU部件的操作方法。

       下面為翻譯的arm官方文檔DDI0464E_cortex_a7_mpcore_r0p4_trm.pdf,這篇文檔主要針對cortex_a7來講的,詳細的講述了PMU部件。【2】

    2.1.1 關於PMU

       基於PMUv2架構,A7處理器在運行時可以收集關於處理器和內存的各種統計信息。對於處理器來說這些統計信息中的事件非常有用,你可以利用它們來調試或者剖析代碼。

       處理器PMU部件提供了4個計數器。每個計數器都可以對處理器的任何事件(可用的)計數。

    2.1.2 PMU功能描述

       主要包含三部分,eventinterface,CP15 and APB interface,Counters

     上圖為PMU部件的組成,主要是那5個計數器。

       Eventinterface

       Eventsfrom all other units from across the design are provided to the PMU.

       提供給PMU部件的所有事件,這些事件全部來自其他的部件。


       CP15and APB interface

The PMUregisters can be programmed using the CP15 system control coprocessor orexternal APB interface.

       PMU寄存器可以通過CP15 協處理器和外部APB接口來編程。


       Counters計數器

       PMU含有4個隨事件增加32位計數器。

       PMU含有1個隨處理器時鍾周期增加的循環計數器。

2.1.3 PMU寄存器匯總

       訪問方式:PMU計數器和PMU控制寄存器可以通過CP15協處理器和APB接口來訪問。

       下表為Cortex-A7MPCore PMU 寄存器,只列出了一部分,詳細查看請看本篇文章底部。

number Offset CRn Op1 CRm Op2 Name Type Description
0 0x000 c9 0 c13 2 PMXEVCNTR0 RW 事件計數寄存器, 參見 the ARM Architecture Reference Manual 手冊
1 0x004 c9 0 c13 2 PMXEVCNTR1 RW
2 0x008 c9 0 c13 2 PMXEVCNTR2 RW
3 0x00C c9 0 c13 2 PMXEVCNTR3 RW
4--30 0x010-0x78 - - - - - Reserved  
31 0x07C c9 0 c13 0 PMCCNTR RW 循環計數寄存器, 參見 the ARM Architecture Reference Manual 手冊
32-255 0x080-0x3FC - - - - - Reserved  
256 0x400 c9 0 c13 1 PMXEVTYPER0 RW 事件類型選擇寄存器, 參見 the ARM Architecture Reference Manual手冊


       操作PMU部件需要通過mrc和mcr指令來操作cp15協處理器。  

2.2 Perf 軟件采樣原理

2.3 Perf采樣精度

如果需要采用高精度的采樣,需要在制定性能事情時,在事件后添加后綴“:p”或者“:pp”。Perf 在采樣精度上定義了4 個級別,如表2 所示。

 

表2. 性能事件的精度級別

 

0 無精度保證

1 采樣指令與觸發性能事件的指令之間的偏差為常數(:p)

2 需要盡量保證采樣指令與觸發性能事件的指令之間的偏差為0(:pp)

3 保證采樣指令與觸發性能事件的指令之間的偏差必須為0(:ppp)

 

3.Perf使用

3.1 使用方法

3.2 Perf常用命令

1、 perf list

2、 perf stat

3、 perf top

4、 perf record/report


參考:

【1】   Linux的系統級性能剖析工具---- 承剛

【2】   DDI0464E_cortex_a7_mpcore_r0p4_trm.pdf---- arm官網

【3】  Perf -- Linux下的系統性能調優工具,第1 部分

https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/

【4】 Perf -- Linux下的系統性能調優工具,第 2 部分

http://www.ibm.com/developerworks/cn/linux/l-cn-perf2/

【5】Linux kernel profiling with perf

   https://perf.wiki.kernel.org/index.php/Tutorial


原文地址:https://blog.csdn.net/chichi123137/article/details/80139237


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM