最近真的是作業連發,喜歡各種亂嘗試如我,真不喜歡被作業追趕阿,感覺做出來的東西沒有整理兩下就還給教授了,品質堪憂阿XD
這篇是系統效能調適的工具和應用介紹,很適合拿來打臉上一個作業寫的效能低下的程式XD 人生就是不斷的打臉,真是太有趣啦^^
一、Perf 簡介
Perf 是用來進行軟體性能分析的工具。
Perf 根據 Linux Kernel 已經定義的 perf_event 來紀錄程式運作的過程,所以只要是 Linux based system 都可以支援。
最初的時候,它叫做 Performance counter,在 2.6.31 中第一次亮相。此後他成為內核開發最為活躍的一個領域。在 2.6.32 中它正式改名為 Performance Event,因為 perf 已不再僅僅作為 PMU 的抽象,而是能夠處理所有的性能相關的事件,例如:
- 硬體事件:instructions retired ,processor clock cycles 等
- 軟體事件:,比如 Page Fault 和進程切換。
- 時鐘週期內的指令數 IPC:IPC 偏低表明代碼沒有很好地利用 CPU
二、Perf 常用指令
照著這些指令一個一個執行下來,應該可以像辦案一樣把吃掉資源的「壞蛋」抓出來XD
本次的範例就拿 reshape-idf.cpp 來玩玩看吧,reshape-idf.cpp 是一個可以把 inverted-file 轉成 sparse matrix 的程式,用於資料檢索與探勘。
- 這次測試的inverted-file 大概 300 mb
- 轉出來的sparse matrix 有 700 mb
下面是可怕的數據XDD
1. sudo perf top : 查看整體系統負載
執行時最耗時的竟然是scan_swap_map... ,該砍掉重練了XD
[補充] 關於page的分配和釋放的函數主要有三個:
- static inline int scan_swap_map(struct swap_info_struct *si)
- swp_entry_t get_swap_page(void)
- void swap_free(swp_entry_t entry)
函數scan_swap_map的目的就是在給定的交換區中找一個空閒page。
2. perf list : 列出所有能夠觸發 perf 採樣點的事件
常見的採樣點分類
3. perf stat : 概括提供程序運行的整體情況
可以看到很誇張的數據,36.717 % cache-misses...
三、結語:系統性能與演算法
藉由這次的嘗試,可以看到同樣的演算法藉由不同的實作方式得到的效能好壞是天差地別的。例如像這次的程式,藉由fin, vector等自動配置的實作方式,對演算法的開發效率有很大的提升,相對的就會犧牲掉硬體的效能。
因此,怎麼在開發效率、演算法效率、硬體執行效率間取得平衡,著實是開發軟體一個有趣的議題呀^^
References
Perf -- Linux下的系統性能調優工具,第 1 部分
Linux 效能分析工具: Perf
Application 效能分析有妙招 — 使用 perf 走天下