首先我們一定會好奇的是perf究竟能監控些什麼,我們可以使用perf list命令檢視perf所能監控到的效能指標。
可以看到有許多的cpu事件,雖然到現在我檢視的資料中沒有乙個能夠將所有事件都解釋的很清楚,但是我們平時常見的並不多。整體上分為了三類,software event,hardware cache event,kernel pmu event。
知道了cpu有哪些效能事件後,我們需要先關注cpu的整體情況,這時perf stat命令恰巧能滿足我們的需求。
常用引數:-p: 根據指定程序的pid對該程序進行監控
perf stat執行效果如下:
截圖中是對程序號為2812的程序cpu使用率進行監控,首先看到最下面一行的time elapsed,這裡輸出的是監控總時長。
下面對輸出的引數做簡要說明:
task-clock:監控時間內程式占用cpu的時間,單位是毫秒。
cpus utilized:cpu使用率,cpus utilized= task-clock/(time elapsed*1000)
context-switches:程式在執行過程中發生的上下文切換次數。
cpu-migrations:程式在執行過程中發生的cpu遷移次數,即被排程器從乙個cpu轉移到另外乙個cpu上執行。
page-faults:缺頁。指當記憶體訪問時先根據程序虛擬位址空間中的虛擬位址通過mmu查詢該記憶體頁在物理記憶體的對映,沒有找到該對映,則發生缺頁,然後通過cpu中斷呼叫處理函式,從物理記憶體中讀取。
cycles:cpu時鐘週期(我截圖中的虛擬機器不支援)。說到cpu時鐘週期就要簡單的講下指令,cpu回到指令集中選取指令執行,乙個指令包含5個步驟:讀取指令,指令解碼,執行,記憶體訪問,寄存區回寫。每個步驟的執行至少都需要乙個cpu的時鐘週期,cpu中有乙個叫功能單元的元件負責處理每個步驟。
instructions:該程序在這段時間內完成的cpu指令(我截圖中的虛擬機器不支援)。在網上看到還會有乙個重要的相關指標:insns per cycle,表示乙個時鐘週期內能完成多少個cpu指令。該值越高,表示cpu的效能越好。
branches:這段時間內發生分支**的次數。比如我們有乙個簡單的if判斷,有10次都是走的true分支,cpu會優先**後續走的都是true
branches-misses:這段時間內分支**失敗的次數,這個值越小越好。
perf stat固然能整體的看到cpu的狀態,但是卻不能告訴我們到底是我們程式的什麼方法導致cpu異常,perf top命令恰巧能滿足我們這個需求,perf top命令與我們平時使用的top命令類似,可以實時檢視當前系統程序函式佔用率整體情況,在這種時候就滿足我們所需要的第一感受。
執行效果如下:
可以看到圖中第一行有三個關鍵字,取樣數:samples,事件:event,事件數量:event count,所以第一行的意思是cpu-clock事件的數量為6k,總事件數為53840912。
再看第二行,第二行其實是下面**的表頭,引數意義如下:
overhead
該symbol
的效能事件佔所有取樣事件中的比例
shared
該symbol所在的動態共享物件(dynamic shared object),如核心、程序名、動態鏈結庫名、核心模組名等
object
是動態共享物件的型別。
[k]:表示核心空間。
symbol
符號名,也是函式名。當函式名未知時,用十六進製制的位址來表示
拿圖中示例解析,我們可以看到_raw_spin_unlock_irqrestore的函式占用最多,為17.65%。共享物件為kernel,型別為核心空間。
perf top我經常常用的引數是-p [pid]和-g,因為大部分時間都是我們自己的**導致cpu使用異常,所以我們可以先使用ps -ef|grep [程序名]來查詢出我們程序的pid,然後使用perf top -p [pid]的命令來檢視具體是哪個函式占用效能較高。而-g引數可以列印出具體的函式呼叫關係,這個對我們做具體的函式優化很有必要,這個引數有助於我們定位到到底是程式的那個函式占用cpu較高。
使用perf top我們只能看到當時的情況,且不能留存,大部分事件我們可能需要統計一段時間的cpu情況,這時候perf record就是不二利器,常用用法:perf record -ag -p [pid],回車執行後監控一段時間,然後按ctrl+c會自動生成乙個perf.data的報告檔案,若想修改輸出檔名,可以使用-o引數,例如: perf record -ago 20200603.data -p 3051,然後使用perf report -i 20200603.data來分析輸出報告。
因為輸出內容與perf top一樣,限於篇幅,這裡不做贅述。
linux效能分析工具之perf
一 perf 之perf stat 輸出 1.perf stat p pid 預設輸出列表 也可以指定輸出 關鍵事件,具體事件 使用 perf list 檢視 1 task clock cpu占用比率 2 cpu migrations cpu 遷移次數 3 page faults 缺頁發生次數,程序...
系統級效能分析工具perf的介紹與使用
perf help之後可以看到perf的二級命令。序號命令作用1 annotate 解析perf record生成的perf.data檔案,顯示被注釋的 2archive 根據資料檔案記錄的build id,將所有被取樣到的elf檔案打包。利用此壓縮包,可以再任何機器上分析資料檔案中記錄的取樣資料。...
MySQL高階效能優化 效能分析
是指資料庫表的每一列都是不可分割的基本資料項,同一列不能有多個值。第一正規化 1nf 是對關係模式的基本要求,不滿足第一正規化的資料庫就不是關聯式資料庫 要求資料庫表中的每個例項或行必須可以被唯一的區分。設定主鍵來區分 要求乙個資料庫表中不包括已在其它表中已包含的非主關鍵資訊。兩張表不要重複的字段,...