1. 程式人生 > 其它 >Linux下測試Python效能

Linux下測試Python效能

測試python檔案

call.py

def call():
    return True

for i in range(10000000):
    call()

time使用

time python call.py

  • real 總耗時 1.488秒
  • user 使用者態耗時 1.255 秒
  • sys 核心態耗時0.230秒

perf使用

perf --help之後可以看到perf的二級命令。

序號 命令 作用
1 annotate 解析perf record生成的perf.data檔案,顯示被註釋的程式碼。
2 archive 根據資料檔案記錄的build-id,將所有被取樣到的elf檔案打包。利用此壓縮包,可以再任何機器上分析資料檔案中記錄的取樣資料。
3 bench perf中內建的benchmark,目前包括兩套針對排程器和記憶體管理子系統的benchmark。
4 buildid-cache 管理perf的buildid快取,每個elf檔案都有一個獨一無二的buildid。buildid被perf用來關聯效能資料與elf檔案。
5 buildid-list 列出資料檔案中記錄的所有buildid。
6 diff 對比兩個資料檔案的差異。能夠給出每個符號(函式)在熱點分析上的具體差異。
7 evlist 列出資料檔案perf.data中所有效能事件。
8 inject 該工具讀取perf record工具記錄的事件流,並將其定向到標準輸出。在被分析程式碼中的任何一點,都可以向事件流中注入其它事件。
9 kmem 針對核心記憶體(slab)子系統進行追蹤測量的工具
10 kvm 用來追蹤測試執行在KVM虛擬機器上的Guest OS。
11 list 列出當前系統支援的所有效能事件。包括硬體效能事件、軟體效能事件以及檢查點。
12 lock 分析核心中的鎖資訊,包括鎖的爭用情況,等待延遲等。
13 mem 記憶體存取情況
14 record 收集取樣資訊,並將其記錄在資料檔案中。隨後可通過其它工具對資料檔案進行分析。
15 report 讀取perf record建立的資料檔案,並給出熱點分析結果。
16 sched 針對排程器子系統的分析工具。
17 script 執行perl或python寫的功能擴充套件指令碼、生成指令碼框架、讀取資料檔案中的資料資訊等。
18 stat 執行某個命令,收集特定程序的效能概況,包括CPI、Cache丟失率等。
19 test perf對當前軟硬體平臺進行健全性測試,可用此工具測試當前的軟硬體平臺是否能支援perf的所有功能。
20 timechart 針對測試期間系統行為進行視覺化的工具
21 top 類似於linux的top命令,對系統性能進行實時分析。
22 trace 關於syscall的工具。
23 probe 用於定義動態檢查點。

全域性性概況:

perf list檢視當前系統支援的效能事件;

perf bench對系統性能進行摸底;

perf test對系統進行健全性測試;

perf stat對全域性效能進行統計;

全域性細節:

perf top可以實時檢視當前系統程序函式佔用率情況;

perf probe可以自定義動態事件;

特定功能分析:

perf kmem針對slab子系統效能分析;

perf kvm針對kvm虛擬化分析;

perf lock分析鎖效能;

perf mem分析記憶體slab效能;

perf sched分析核心排程器效能;

perf trace記錄系統呼叫軌跡;

最常用功能perf record,可以系統全域性,也可以具體到某個程序,更甚具體到某一程序某一事件;可巨集觀,也可以很微觀。

pref record記錄資訊到perf.data;

perf report生成報告;

perf diff對兩個記錄進行diff;

perf evlist列出記錄的效能事件;

perf annotate顯示perf.data函式程式碼;

perf archive將相關符號打包,方便在其它機器進行分析;

perf script將perf.data輸出可讀性文字;

視覺化工具perf timechart

perf timechart record記錄事件;

perf timechart生成output.svg文件;

關於perf top介面常用命令如下:

h:顯示幫助,即可顯示詳細的幫助資訊。

UP/DOWN/PGUP/PGDN/SPACE:上下和翻頁。

a:annotate current symbol,註解當前符號。能夠給出組合語言的註解,給出各條指令的取樣率。

d:過濾掉所有不屬於此DSO的符號。非常方便檢視同一類別的符號。

P:將當前資訊儲存到perf.hist.N中。

perf top常用選項有:

-e :指明要分析的效能事件。

-p :Profile events on existing Process ID (comma sperated list). 僅分析目標程序及其建立的執行緒。

-k :Path to vmlinux. Required for annotation functionality. 帶符號表的核心映像所在的路徑。

-K:不顯示屬於核心或模組的符號。

-U:不顯示屬於使用者態程式的符號。

-d :介面的重新整理週期,預設為2s,因為perf top預設每2s從mmap的記憶體區域讀取一次效能資料。

-g:得到函式的呼叫關係圖。

perf top --call-graph [fractal],路徑概率為相對值,加起來為100%,呼叫順序為從下往上。

perf top --call-graph graph,路徑概率為絕對值,加起來為該函式的熱度。

perf stat

perf stat用於執行指令,並分析其統計結果。雖然perf top也可以指定pid,但是必須先啟動應用才能檢視資訊。

perf stat能完整統計應用整個生命週期的資訊。

命令格式為:

perf stat [-e | --event=EVENT] [-a]
perf stat [-e | --event=EVENT] [-a] — []

下面簡單看一下perf stat 的輸出:

[root@master ~]# perf stat
Performance counter stats for 'system wide':

40904.820871 cpu-clock (msec) # 5.000 CPUs utilized
18,132 context-switches # 0.443 K/sec
1,053 cpu-migrations # 0.026 K/sec
2,420 page-faults # 0.059 K/sec
3,958,376,712 cycles # 0.097 GHz (49.99%)
574,598,403 stalled-cycles-frontend # 14.52% frontend cycles idle (49.98%)
9,392,982,910 stalled-cycles-backend # 237.29% backend cycles idle (50.00%)
1,653,185,883 instructions # 0.42 insn per cycle
# 5.68 stalled cycles per insn (50.01%)
237,061,366 branches # 5.795 M/sec (50.02%)
18,333,168 branch-misses # 7.73% of all branches (50.00%)

​ 8.181521203 seconds time elapsed

輸出解釋如下:

cpu-clock:任務真正佔用的處理器時間,單位為ms。CPUs utilized = task-clock / time elapsed,CPU的佔用率。

context-switches:程式在執行過程中上下文的切換次數。

CPU-migrations:程式在執行過程中發生的處理器遷移次數。Linux為了維持多個處理器的負載均衡,在特定條件下會將某個任務從一個CPU遷移到另一個CPU。

CPU遷移和上下文切換:發生上下文切換不一定會發生CPU遷移,而發生CPU遷移時肯定會發生上下文切換。發生上下文切換有可能只是把上下文從當前CPU中換出,下一次排程器還是將程序安排在這個CPU上執行。

page-faults:缺頁異常的次數。當應用程式請求的頁面尚未建立、請求的頁面不在記憶體中,或者請求的頁面雖然在記憶體中,但實體地址和虛擬地址的對映關係尚未建立時,都會觸發一次缺頁異常。另外TLB不命中,頁面訪問許可權不匹配等情況也會觸發缺頁異常。

cycles:消耗的處理器週期數。如果把被ls使用的cpu cycles看成是一個處理器的,那麼它的主頻為2.486GHz。可以用cycles / task-clock算出。

stalled-cycles-frontend:指令讀取或解碼的質量步驟,未能按理想狀態發揮並行左右,發生停滯的時鐘週期。

stalled-cycles-backend:指令執行步驟,發生停滯的時鐘週期。

instructions:執行了多少條指令。IPC為平均每個cpu cycle執行了多少條指令。

branches:遇到的分支指令數。branch-misses是預測錯誤的分支指令數。

其他常用引數

-a, --all-cpus 顯示所有CPU上的統計資訊
-C, --cpu 顯示指定CPU的統計資訊
-c, --scale scale/normalize counters
-D, --delay ms to wait before starting measurement after program start
-d, --detailed detailed run - start a lot of events
-e, --event event selector. use 'perf list' to list available events
-G, --cgroup monitor event in cgroup name only
-g, --group put the counters into a counter group
-I, --interval-print
print counts at regular interval in ms (>= 10)
-i, --no-inherit child tasks do not inherit counters
-n, --null null run - dont start any counters
-o, --output 輸出統計資訊到檔案
-p, --pid stat events on existing process id
-r, --repeat repeat command and print average + stddev (max: 100, forever: 0)
-S, --sync call sync() before starting a run
-t, --tid stat events on existing thread id
...

示例

前面統計程式的示例,下面看一下統計CPU資訊的示例:

perf stat python call.py

perf top -C 0

Flame Graph

FlameGraph

1.抓取perf資訊並轉換

perf record -F 99 -a -g -- sleep 60
perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.kern_folded > kernel.svg

參考資料

系統級效能分析工具 — Perf:http://blog.csdn.net/zhangskd/article/details/37902159/

此時此刻,非我莫屬