在計算機性能方面,我們指的是資源與在一定時間內完成的任務之間的關係。

在公司之間激烈競爭的今天,我們要學會如何充分利用我們所擁有的資源。浪費硬件或軟件資源,或者不知道如何更有效地使用它們,將導致我們無法承受的損失,這對我們想要保持競爭力是不能接受的。
同時,我們必須小心,不要將我們的資源推向一個持續使用將導致無法彌補的損壞的極限。
在本文中,我們將向您介紹一種相對較新的性能分析工具,並提供一些監控Linux系統(包括硬件和應用程序)的技巧。這將幫助您確保它們運行良好,從而能夠產生所需的結果,而不浪費資源或自己的精力。
在Linux中介紹和安裝Perf
Linux提供了一個性能監控和分析工具,方便地稱為perf。那麼,perf與您已經熟悉的其他知名工具有何不同呢?
答案是perf可以訪問CPU中的性能監控單元,從而讓我們可以仔細觀察硬件及其相關事件的行為。
您可以在基于RPM的发行版中安装perf,方法如下:
# yum update && yum install perf [CentOS / RHEL / Fedora] # dnf update && dnf install perf [Fedora 23+ releases]
在Debian及其衍生版本中:
# sudo aptitude update && sudo aptitude install linux-tools-$(uname -r) linux-tools-generic
如果上述命令中的uname -r
返回除实际版本外的额外字符串(在我的情况下是3.2.0-23-generic),您可能需要键入linux-tools-3.2.0-23,而不是使用uname的输出。
还需注意,当在VirtualBox或VMWare的虚拟机中运行时,perf会产生不完整的结果,因为它们不允许访问硬件计数器,而其他虚拟化技术(如KVM或XEN)可以。
此外,请记住,默认情况下某些perf命令可能受到root用户的限制,可以通过以下方式禁用(直到系统重新启动):
# echo 0 > /proc/sys/kernel/perf_event_paranoid
如果您需要永久禁用偏执模式,請更新/etc/sysctl.conf文件中的以下設置。
kernel.perf_event_paranoid = 0
子命令
安裝了perf之後,您可以參考它的手冊以獲取可用子命令的列表(您可以將子命令視為打開系統特定窗口的特殊選項)。為了獲得最佳和更完整的結果,請以root或通過sudo使用perf。
Perf列表
perf list(不帶選項)返回所有符號事件類型(長列表)。如果您想查看特定類別中可用事件的列表,請使用perf list後跟類別名稱([hw|sw|cache|tracepoint|pmu|event_glob]),例如:
顯示Linux中預定義軟件事件的列表:
# perf list sw

Perf stat
perf stat運行一個命令,並在執行該命令期間收集Linux性能統計。當我們運行dd時,系統上會發生什麼?
# perf stat dd if=/dev/zero of=test.iso bs=10M count=1

上面顯示的統計數據表明,包括:
- 執行dd命令耗費了21.812281毫秒的CPU。如果我們將此數字除以下面的“經過的秒數”值(23.914596毫秒),則得到0.912(CPU利用率)。
- 當執行該指令時,15次上下文切換(也稱為進程切換)表示CPU從一個進程(或線程)切換到另一個進程15次。
- 2個CPU遷移是在2核CPU中工作負載均勻分佈在核心數量時的預期結果。
在此期間(21.812281毫秒),消耗的CPU周期總數為62,025,623,除以0.021812281秒得到2.843 GHz。 - 如果將週期數除以總指令數,得到4.9個每指令週期,這意味著每條指令平均需要近5個CPU週期才能完成。這在一定程度上可以歸咎於分支和分支錯失的數量(見下文),這些都會浪費或誤用CPU週期。
- 當執行該指令時,共遇到3,552,630個分支。這是代碼中決策點和循環的CPU級表示。分支越多,性能越低。為彌補這一點,所有現代CPU都試圖預測代碼流程將採取的路徑。51,348個分支錯失表明預測功能錯誤率為1.45%。
相同的原則適用於在應用程序運行時收集統計信息(或者換句話說,進行分析)。只需啟動所需的應用程序,在合理的時間內(由您決定)關閉它,perf將在屏幕上顯示統計信息。通過分析這些統計信息,您可以識別潛在問題。
Perf top
perf top與top命令類似,它顯示幾乎是實時的系統概要(也稱為實時分析)。
使用-a
選項將顯示所有已知的事件類型,而-e
選項將允許您選擇特定的事件類別(由perf list返回):
將顯示所有循環事件。
perf top -a
將顯示所有與cpu時鐘相關的事件。
perf top -e cpu-clock

上面輸出的第一列表示自運行開始以來採樣的百分比,按函數符號和共享對象分組。在man perf-top中有更多選項。
Perf record
perf record運行一個命令並將統計數據保存到名為perf.data的文件中,該文件位於當前工作目錄中。它運行方式類似於perf stat。
輸入perf record,然後輸入一個命令:
# perf record dd if=/dev/null of=test.iso bs=10M count=1

Perf report
perf report將上述perf.data中收集的數據格式化為性能報告:
# sudo perf report

上述子命令都有專用的man頁面,可以通過調用:
# man perf-subcommand
subcommand 可以是 list, stat, top, record, 或 report。這些是最常用的子命令;其他子命令列在文件中(請參考摘要部分的鏈接)。
摘要
在本指南中,我們向您介紹了 perf,這是一個用於 Linux 的性能監控和分析工具。我們強烈建議您熟悉其文檔,該文檔維護在 https://perf.wiki.kernel.org。
如果您發現某些應用程序消耗了大量資源,您可以考慮修改源代碼,或使用其他替代方案。
如果您對本文有疑問或改進建議,我們樂意聽取。請隨時使用下面的評論表格與我們聯繫。
Source:
https://www.tecmint.com/perf-performance-monitoring-and-analysis-tool-for-linux/