新聞中心
Linux Perf是一個(gè)功能強(qiáng)大的性能分析工具,可用于檢查Linux系統(tǒng)中函數(shù)的性能。它可以幫助程序員找出正在運(yùn)行的程序或代碼的瓶頸,并提供實(shí)時(shí)和歷史數(shù)據(jù)來指導(dǎo)和優(yōu)化應(yīng)用程序的性能。本文將介紹如何使用Linux Perf來檢查函數(shù)的性能。

宣州網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,宣州網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為宣州上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個(gè)售后服務(wù)好的宣州做網(wǎng)站的公司定做!
1. 安裝Perf
在使用Perf之前,首先需要安裝它。Perf已經(jīng)包含在Linux內(nèi)核的源代碼中,所以可以直接使用命令行安裝:
“`
sudo apt-get update
sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r)
“`
安裝完之后,您可以開始使用Perf工具來檢查函數(shù)的性能。
2. 使用Perf進(jìn)行函數(shù)性能分析
在了解如何使用Perf之前,首先需要了解Perf可以監(jiān)視哪些相關(guān)的性能瓶頸。以下是Perf支持的功能:
CPU事件,例如硬件性能計(jì)數(shù)器和CPU clock等。
軟件事件,例如CPU周期和指令等。
監(jiān)視事件周期性和時(shí)間段性。
打印調(diào)用堆棧和棧跟蹤等。
制作和記錄跟蹤點(diǎn),可以用于可視化。
了解這些功能之后,您可以編寫一些代碼來測試Perf。以下是一些使用Perf進(jìn)行性能分析的示例:
$ perf stat -e cycles,instructions -p PID
這個(gè)命令將檢查進(jìn)程ID為PID的運(yùn)行時(shí)間(在周期和指令方面)。
要收集采樣,可以使用以下命令:
$ perf record ./a.out
這將收集程序a.out的采樣,并將結(jié)果存儲(chǔ)在perf.data文件中。
要打印收集的跟蹤數(shù)據(jù),可以使用以下命令:
$ perf report
或者,您可以使用以下命令:
$ perf report -n –stdio
這將輸出統(tǒng)計(jì)數(shù)據(jù),以幫助您查找性能瓶頸。
要檢查特定函數(shù)的性能,可以使用以下命令:
$ perf record -e cycles,instructions -g ./a.out
這將收集采樣數(shù)據(jù)和調(diào)用鏈(即函數(shù)調(diào)用)。
在此之后,您可以使用以下命令查看輸出:
$ perf report -g
這將提供有關(guān)在函數(shù)中花費(fèi)的時(shí)間和總調(diào)用次數(shù)等信息。
:
現(xiàn)在,您了解了如何在Linux上使用Perf分析函數(shù)的性能。使用這些命令,您可以比以往更加精確地了解代碼的運(yùn)行情況,并找到可能影響程序性能的問題。如果您進(jìn)行更詳細(xì)的分析,可以使用多種選項(xiàng)進(jìn)行更深入的探索。
相關(guān)問題拓展閱讀:
- cpu指標(biāo)含義解釋
- linux服務(wù)器cpu性能參數(shù)如何看
- 容器內(nèi)的Linux診斷工具x.tools
cpu指標(biāo)含義解釋
CPU使用率
Linux 通過 /proc 虛擬文件系統(tǒng),向用戶空間提供了系統(tǒng)內(nèi)部狀態(tài)的信息,而 /proc/stat 提供的就是系統(tǒng)的 CPU 和任務(wù)統(tǒng)計(jì)信息
proc – process information pseudo-file system
查螞判詢 man proc
關(guān)鍵指標(biāo)常用參數(shù)
user(通??s寫為 us),代表用戶態(tài) CPU 時(shí)間。注意,它不包括下面的 nice 時(shí)間,但包括了 guest 時(shí)間。
nice(通??s寫為 ni),代表低優(yōu)先級(jí)用戶態(tài) CPU 時(shí)間,也就是進(jìn)程的 nice 值被調(diào)整為 1-19 之間時(shí)的 CPU 時(shí)間。這里注意,nice 可取值范圍是 -20 到 19,數(shù)值越大,優(yōu)先級(jí)反而越低。
system(通??s寫為 sys),代表內(nèi)核態(tài) CPU 時(shí)間。
idle(通常縮寫為 id),代表空閑時(shí)間。注意,它不包括等待 I/O 的時(shí)間(iowait)。
iowait(通??s寫為 wa),代表等待 I/O 的 CPU 時(shí)間。
irq(通常縮寫為 hi),代表處理硬中斷的 CPU 時(shí)間。
softirq(通??s寫為 si),代表處理軟中斷的 CPU 時(shí)間。
steal(通常縮寫為 st),代表當(dāng)系統(tǒng)運(yùn)行在虛擬機(jī)中的時(shí)候,被其他虛擬機(jī)占用的 CPU 時(shí)間。
guest(通??s寫為 guest),代表通過虛擬化運(yùn)行其他操作系統(tǒng)的時(shí)間,也就是運(yùn)行虛擬機(jī)的 CPU 時(shí)間。
guest_nice(通??s寫為 gnice),代表以低優(yōu)先級(jí)運(yùn)行虛擬機(jī)的時(shí)間
工具使用
top
# top
top – 15:16:08 up 4 days, 3:12, 1 user, load average: 3.77, 2.88, 2.52
Tasks: 255 total, 1 running, 254 sleeping, 0 stopped, 0 zombie
%Cpu0 : 99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 42.3 us, 4.8 sy, 0.0 ni, 50.2 id, 0.7 wa, 0.0 hi, 2.0 si, 0.0 st
KiB Mem :total,free,used,buff/cache
KiB Swap:total,free,used.avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
rootS 93.7 0.0 832:50.08 kswapd0
rootS 64.2 0.3 25:58.04 t
rootS 6.6 2.1 317:33.63 kubelet
rootR 0.3 0.0 0:00.53 top
// top 默認(rèn)顯示的是所有 CPU 的平均值,這個(gè)時(shí)候你只需要按下數(shù)字 1 ,就可以切換到每個(gè) CPU 的使用率了。
S 列(也就是啟伏 Status 列)表示進(jìn)程的狀態(tài)
進(jìn)程的狀態(tài)主要有以下幾個(gè):
R 是 Running 或 Runnable 的縮寫,表示進(jìn)程在 CPU 的就緒隊(duì)列中,正在運(yùn)行或者正在等待運(yùn)行。
D 是 Disk Sleep 的縮寫,也就是不可中斷狀態(tài)睡眠(Uninterruptible Sleep),一般表示進(jìn)程正在跟硬件交互,并且交互過程不允許被其他進(jìn)程或中斷打斷。
Z 是 Zombie 的縮寫,它表示僵尸悶旁改進(jìn)程,也就是進(jìn)程實(shí)際上已經(jīng)結(jié)束了,但是父進(jìn)程還沒有回收它的資源(比如進(jìn)程的描述符、PID 等)。
S 是 Interruptible Sleep 的縮寫,也就是可中斷狀態(tài)睡眠,表示進(jìn)程因?yàn)榈却硞€(gè)事件而被系統(tǒng)掛起。當(dāng)進(jìn)程等待的事件發(fā)生時(shí),它會(huì)被喚醒并進(jìn)入 R 狀態(tài)。
I 是 Idle 的縮寫,也就是空閑狀態(tài),用在不可中斷睡眠的內(nèi)核線程上。前面說了,硬件交互導(dǎo)致的不可中斷進(jìn)程用 D 表示,但對某些內(nèi)核線程來說,它們有可能實(shí)際上并沒有任何負(fù)載,用 Idle 正是為了區(qū)分這種情況。要注意,D 狀態(tài)的進(jìn)程會(huì)導(dǎo)致平均負(fù)載升高, I 狀態(tài)的進(jìn)程卻不會(huì)。
pidstat
用戶態(tài) CPU 使用率 (%usr);
內(nèi)核態(tài) CPU 使用率(%system);
運(yùn)行虛擬機(jī) CPU 使用率(%guest);
等待 CPU 使用率(%wait);
總的 CPU 使用率(%CPU)。
# pidstat 1 5
Linux 3.10.0-1062.4.1.el7.x86_64 (instance-010oj085)/06/2023 _x86_64_ (2 CPU)
03:23:11 PM UIDPID %usr %system %guest %CPU CPU Command
03:23:12 PM….kube-controller
03:23:12 PM….etcd
03:23:12 PM….pidstat
03:23:12 PM….hosteye
03:23:12 PM….kubelet
03:23:12 PM….kube-apiserver
03:23:12 PM….kswapd0
perf
perf 是 Linux 2.6.31 以后內(nèi)置的性能分析工具。它以性能事件采樣為基礎(chǔ),不僅可以分析系統(tǒng)的各種事件和內(nèi)核性能,還可以用來分析指定應(yīng)用程序的性能問題??梢圆檎覠狳c(diǎn)函數(shù)。
# perf top
Samples: 75K of event ‘cycles’, 4000 Hz, Event count (approx.):lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
1.57% kswapd 0xc
1.10% perf-3482.map 0x00007fdbbf621e8c
0.68% t 0xf147
0.61% kswapd 0xc8647
0.60% perf-3482.map 0x00007fdbbf621eb5
輸出結(jié)果中,之一行包含三個(gè)數(shù)據(jù),分別是采樣數(shù)(Samples)、事件類型(event)和事件總數(shù)量(Event count)。
之一列 Overhead ,是該符號(hào)的性能事件在所有采樣中的比例,用百分比來表示。
第二列 Shared ,是該函數(shù)或指令所在的動(dòng)態(tài)共享對象(Dynamic Shared Object),如內(nèi)核、進(jìn)程名、動(dòng)態(tài)鏈接庫名、內(nèi)核模塊名等。
第三列 Object ,是動(dòng)態(tài)共享對象的類型。比如 表示用戶空間的可執(zhí)行程序、或者動(dòng)態(tài)鏈接庫,而 則表示內(nèi)核空間。
最后一列 Symbol 是符號(hào)名,也就是函數(shù)名。當(dāng)函數(shù)名未知時(shí),用十六進(jìn)制的地址來表示。
dstat
dstat可以讓你實(shí)時(shí)地看到所有系統(tǒng)資源,例如,你能夠通過統(tǒng)計(jì)IDE控制器當(dāng)前狀態(tài)來比較磁盤利用率,或者直接通過網(wǎng)絡(luò)帶寬數(shù)值來比較磁盤的吞吐率(在相同的時(shí)間間隔內(nèi))
# dstat
You did not select any stats, using -cdngy by default.
—-total-cpu-usage—- -dsk/total- -net/total- —paging– —system–
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
|4910B 470k|||
|k| 394k 267k||
|k| 362k 230k||
|B| 287k 196k||
|k| 360k 235k||
默認(rèn)輸出信息:
CPU狀態(tài):CPU的使用率。這項(xiàng)報(bào)告更有趣的部分是顯示了用戶,系統(tǒng)和空閑部分,這更好地分析了CPU當(dāng)前的使用狀況。如果你看到”wait”一欄中,CPU的狀態(tài)是一個(gè)高使用率值,那說明系統(tǒng)存在一些其它問題。當(dāng)CPU的狀態(tài)處在”waits”時(shí),那是因?yàn)樗诘却齀/O設(shè)備(例如內(nèi)存,磁盤或者網(wǎng)絡(luò))的響應(yīng)而且還沒有收到。
磁盤統(tǒng)計(jì):磁盤的讀寫操作,這一欄顯示磁盤的讀、寫總數(shù)。
網(wǎng)絡(luò)統(tǒng)計(jì):網(wǎng)絡(luò)設(shè)備發(fā)送和接受的數(shù)據(jù),這一欄顯示的網(wǎng)絡(luò)收、發(fā)數(shù)據(jù)總數(shù)。
分頁統(tǒng)計(jì):系統(tǒng)的分頁活動(dòng)。分頁指的是一種內(nèi)存管理技術(shù)用于查找系統(tǒng)場景,一個(gè)較大的分頁表明系統(tǒng)正在使用大量的交換空間,或者說內(nèi)存非常分散,大多數(shù)情況下你都希望看到page in(換入)和page out(換出)的值是0 0。
系統(tǒng)統(tǒng)計(jì):這一項(xiàng)顯示的是中斷(int)和上下文切換(csw)。這項(xiàng)統(tǒng)計(jì)僅在有比較基線時(shí)才有意義。這一欄中較高的統(tǒng)計(jì)值通常表示大量的進(jìn)程造成擁塞,需要對CPU進(jìn)行關(guān)注。你的服務(wù)器一般情況下都會(huì)運(yùn)行運(yùn)行一些程序,所以這項(xiàng)總是顯示一些數(shù)值
pstree
// 指定 pid 查找父進(jìn)程
# pstree -aps 18035
systemd,1 –switched-root –system –deserialize 22
`-sshd,2504 -D
`-sshd,16674
`-bash,16676
`-top,18035
總結(jié)
用戶 CPU 和 Nice CPU 高,說明用戶態(tài)進(jìn)程占用了較多的 CPU,所以應(yīng)該著重排查進(jìn)程的性能問題。
系統(tǒng) CPU 高,說明內(nèi)核態(tài)占用了較多的 CPU,所以應(yīng)該著重排查內(nèi)核線程或者系統(tǒng)調(diào)用的性能問題。
I/O 等待 CPU 高,說明等待 I/O 的時(shí)間比較長,所以應(yīng)該著重排查系統(tǒng)存儲(chǔ)是不是出現(xiàn)了 I/O 問題。
軟中斷和硬中斷高,說明軟中斷或硬中斷的處理程序占用了較多的 CPU,所以應(yīng)該著重排查內(nèi)核中的中斷服務(wù)程序。
進(jìn)程狀態(tài)
ps 或者 top ,可以查看進(jìn)程的狀態(tài),這些狀態(tài)包括運(yùn)行(R)、空閑(I)、不可中斷睡眠(D)、可中斷睡眠(S)、僵尸(Z)以及暫停(T)等。
不可中斷狀態(tài),表示進(jìn)程正在跟硬件交互,為了保護(hù)進(jìn)程數(shù)據(jù)和硬件的一致性,系統(tǒng)不允許其他進(jìn)程或中斷打斷這個(gè)進(jìn)程。進(jìn)程長時(shí)間處于不可中斷狀態(tài),通常表示系統(tǒng)有 I/O 性能問題。
僵尸進(jìn)程表示進(jìn)程已經(jīng)退出,但它的父進(jìn)程還沒有回收子進(jìn)程占用的資源。短暫的僵尸狀態(tài)我們通常不必理會(huì),但進(jìn)程長時(shí)間處于僵尸狀態(tài),就應(yīng)該注意了,可能有應(yīng)用程序沒有正常處理子進(jìn)程的退出。
常見問題
CPU使用率很高,通過top等命令找不到相應(yīng)的進(jìn)程
應(yīng)用里直接調(diào)用了其他二進(jìn)制程序,這些程序通常運(yùn)行時(shí)間比較短,通過 top 等工具也不容易發(fā)現(xiàn)。
linux服務(wù)器cpu性能參數(shù)如何看
processor: 44(處理器線程序號(hào),包括內(nèi)核和超線程)
vendor_id: AuthenticAMD(品牌AMD)
cpu family : 21(CPU家族代號(hào))
model: 1(型號(hào)代號(hào))
model name : AMD Opteron(TM) Processor 6234(型號(hào)名稱)
stepping: 2(工藝步進(jìn))
cpu MHz: 2400.127(主頻2.4G)
cache size : 2023 KB(答搏消緩存2M)
physical id : 0(CPU物理封裝的序號(hào))銀仔
siblings: 12(邏輯處理器數(shù)量,相當(dāng)于線程數(shù)。)清知
core id: 5(CPU物理內(nèi)核的序號(hào))
cpu cores: 6(CPU物理內(nèi)核的數(shù)量)
apicid: 43
initial apicid : 11
fpu: yes
fpu_exception : yes
cpuid level : 13
wp: yes
沒有12位的處理器。你的CPU是64位的。
由于AMD采用多線程技術(shù)與Intel不一樣,這款CPU應(yīng)描述為6模塊12核,而不是6核12線程。
processor:(44個(gè)線程)
vendor_id: AuthenticAMD (amd 這個(gè)不用多說吧)
cpu family :(cpu 家族)
model: 1 (運(yùn)行模式 1 )
model name : AMD Opteron(TM) Processor(模梁孫式名稱)
stepping:(cpu時(shí)鐘間隔)
cpu MHz: 2400.127 (主頻)
cache size : 2023 KB (緩存大小 2M)
physical id : 0 (物理ID號(hào))
siblings:(橡改鏈12位)
core id:(核心ID號(hào))
cpu cores: 6 (殲殲核心數(shù):6核)
apicid: 43
initial apicid :
fpu: yes
fpu_exception : yes
cpuid level : 13
wp: yes
AMD Opteron(TM) Processor 6234
這一句足夠了。
實(shí)際來櫻蔽說要看你的機(jī)器到底什么配置。如果是 VPS 這種虛擬機(jī),CPU 型號(hào)和實(shí)際系統(tǒng)能用的 CPU 性能都是可以被限制的。敏螞看這堆信息沒什么意義。還不如直接打脊拿州開機(jī)箱看看,如果是獨(dú)立服務(wù)器,一般都應(yīng)該知道具體配置了。服務(wù)器我還沒見到坑人說好 CPU 結(jié)果上破爛貨的掛羊頭賣狗肉的事情。
型橘拆櫻御碰號(hào) : AMD Opteron(TM) Processor
cpu MHz: 2400.127
CPU核圓叢心: 6
容器內(nèi)的Linux診斷工具x.tools
Linux上有大量的問題診斷工具,如perf、bcc等,但這些診斷工具,雖然功能強(qiáng)大,但卻需要很高的權(quán)限才可以使用。
而0x.tools這個(gè)工具提供了一個(gè)很好的思路,通過采樣 /proc 目錄來診斷問題,對被測量程序幾乎無性能影響,且只要與目標(biāo)進(jìn)程擁有同等級(jí)的權(quán)限,即可正常使用。
不要小看這個(gè)權(quán)限區(qū)別,在互聯(lián)網(wǎng)大廠,開發(fā)同學(xué)一般只能嘩拿逗獲取到一個(gè)受限于容器內(nèi)的shell環(huán)境,想要獲取機(jī)器的root權(quán)限幾乎是不可能的。
實(shí)際上0x.tools里的工具大多數(shù)是腳本,如psn工具是python腳本,因此直接將代碼clone下來,然后執(zhí)行 bin/psn 也是可以的。
psn 工具用來觀測系統(tǒng)中當(dāng)前活躍的線程正在做什么,如線程在做什么系統(tǒng)調(diào)用、寫什么文件、阻塞在哪個(gè)內(nèi)核函數(shù)下?
如上,默認(rèn)情況下,psn采樣 /proc 目錄下每個(gè)線程的 /proc/$pid/stat 文件,采樣5秒鐘,將R(正在運(yùn)行)或D(不可中斷休眠)狀態(tài)的線程的數(shù)據(jù)記錄下來,并做匯總。
由于R或D狀態(tài)的線程都是活躍線程,被采樣到的次數(shù)越多,則越說明這些線程敏梁運(yùn)行得更慢或更頻繁。
通過 -G 可以指定需要查看的列,syscall表示線程正在執(zhí)行的系統(tǒng)調(diào)用,filenamesum表示正在讀寫的文件,一亂賣般來說,線程處于D狀態(tài)時(shí)在做文件io操作,如果D狀態(tài)線程頻繁出現(xiàn),那么我們肯定想知道線程正在讀寫哪個(gè)文件。
同理,通過wchan字段可以查看線程阻塞在什么內(nèi)核方法上,而kstack字段則可以查看線程阻塞時(shí)的內(nèi)核調(diào)用棧是什么。
其實(shí)psn和ps命令一樣,是通過遍歷/proc目錄來獲取線程信息的,如下:
state:取自 /proc/$pid/stat 文件。
syscall:取自 /proc/$pid/syscall 文件。
wchan:取自 /proc/$pid/wchan 文件。
kstack:取自 /proc/$pid/stack 文件。
與perf、bcc等工具的區(qū)別是,讀取這些文件只需要與進(jìn)程同等級(jí)的權(quán)限即可,不需要使用root賬號(hào)。
除了psn外,0x.tools里面還有一些其它工具,如xcapture、schedlat等,這里就不一一介紹了,感興趣可以訪問
查看。
另外,由于psn是通過遍歷 /proc 目錄實(shí)現(xiàn)的,因此我們也可自己編寫腳本來實(shí)現(xiàn)同樣的功能,如下:
這樣,我們不用安裝0x.tools,就也能得到類似于psn命令的功能了!
linux perf查看函數(shù)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux perf查看函數(shù),如何使用Linux Perf查看函數(shù)性能?,cpu指標(biāo)含義解釋,linux服務(wù)器cpu性能參數(shù)如何看,容器內(nèi)的Linux診斷工具x.tools的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享標(biāo)題:如何使用LinuxPerf查看函數(shù)性能?(linuxperf查看函數(shù))
網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/dhejgoh.html


咨詢
建站咨詢
