linux高階工具命令(三)使用gprof和oprofile查詢效能瓶頸
有些時候,我們特別關注程式的效能,特別是底層軟體,比如驅動程式,OS等。為了更好的優化程式效能,我們必須找到效能瓶頸點,“好鋼用在刀刃上”才能取得好的效果,否則可能白做工作。為了找到關鍵路徑,我們可以使用profilng技術,在linux平臺上,我們可以使用gprof和oprofile工具。
我們以編譯執行hello.c為例,來說明如何使用這兩個工具,這裡不解釋具體結果的含義,要想詳細瞭解每個結果代表什麼意思,可以看一下參考資料中官方站點上的doc資訊,裡面會給你詳盡的解釋。
gprof Quick Start
gprof是gnu binutils工具之一,預設情況下linux系統當中都帶有這個工具。
oprofile是sourceforge上面的一個開源專案,在2.6核心上帶有這個工具,好像只有smp系統才有。比較老的系統,需要自己安裝,重新編譯核心。
oprofile是一套工具,分別完成不同的事情。
- gprof是GNU工具之一,它在編譯的時候在每個函式的出入口加入了profiling的程式碼,執行時統計程式在使用者態的執行資訊,可以得到每個函式的呼叫次數,執行時間,呼叫關係等資訊,簡單易懂。適合於查詢使用者級程式的效能瓶頸,對於很多時間都在核心態執行的程式,gprof不適合。
- oprofile也是一個開源的profiling工具,它使用硬體除錯暫存器來統計資訊,進行profiling的開銷比較小,而且可以對核心進行profiling。它統計的資訊非常的多,可以得到cache的缺失率,memory的訪存資訊,分支預測錯誤率等等,這些資訊gprof是得不到的,但是對於函式呼叫次數,它是不能夠得到的。。
我們以編譯執行hello.c為例,來說明如何使用這兩個工具,這裡不解釋具體結果的含義,要想詳細瞭解每個結果代表什麼意思,可以看一下參考資料中官方站點上的doc資訊,裡面會給你詳盡的解釋。
gprof Quick Start
gprof是gnu binutils工具之一,預設情況下linux系統當中都帶有這個工具。
- 使用 -pg 選項來編譯hello.c,如果要得到帶註釋的原始碼清單,則需要增加 -g 選項。執行: gcc -pg -g -o hello hello.c
- 執行應用程式: ./hello 會在當前目錄下產生gmon.out檔案
- 使用gprof來分析gmon.out檔案,需要把它和產生它的應用程式關聯起來:
- gprof hello gmon.out -p 得到每個函式佔用的執行時間
- gprof hello gmon.out -q 得到call graph,包含了每個函式的呼叫關係,呼叫次數,執行時間等資訊。
- gprof hello gmon.out -A 得到一個帶註釋的“原始碼清單”,它會註釋原始碼,指出每個函式的執行次數。這需要在編譯的時候增加 -g選項。
oprofile是sourceforge上面的一個開源專案,在2.6核心上帶有這個工具,好像只有smp系統才有。比較老的系統,需要自己安裝,重新編譯核心。
oprofile是一套工具,分別完成不同的事情。
op_help: 列出所有支援的事件。
opcontrol:設定需要收集的事件。
opreport: 對結果進行統計輸出。
opannaotate:產生帶註釋的源/彙編檔案,源語言級的註釋需要編譯原始檔時的支援。
opstack: 產生呼叫圖profile,但要求x86/2.6的平臺,並且linux2.6安裝了call-graph patch
opgprof: 產生如gprof相似的結果。
oparchive: 將所有的原始資料檔案收集打包,可以到另一臺機器上進行分析。
op_import: 將取樣的資料庫檔案從另一種abi轉化成本地格式。
執行oprofile需要root許可權,因為它要載入profile模組,啟動oprofiled後臺程式等。所以在執行之前,就需要切換到root。opcontrol:設定需要收集的事件。
opreport: 對結果進行統計輸出。
opannaotate:產生帶註釋的源/彙編檔案,源語言級的註釋需要編譯原始檔時的支援。
opstack: 產生呼叫圖profile,但要求x86/2.6的平臺,並且linux2.6安裝了call-graph patch
opgprof: 產生如gprof相似的結果。
oparchive: 將所有的原始資料檔案收集打包,可以到另一臺機器上進行分析。
op_import: 將取樣的資料庫檔案從另一種abi轉化成本地格式。
- opcontrol --init 載入模組,mout /dev/oprofile 建立必需的檔案和目錄
- opcontrol --no-vmlinux 或者 opcontrol --vmlinux=/boot/vmlinux-`uname -r` 決定是否對kernel進行profiling
- opcontrol --reset 清楚當前會話中的資料
- opcontrol --start 開始profiling
- ./hello 執行應用程式,oprofile會對它進行profiling
- opcontrol --dump 把收集到的資料寫入檔案
- opcontrol --stop 停止profiling
- opcotrol -h 關閉守護程式oprofiled
- opcontrol --shutdown 停止oprofiled
- opcontrol --deinit 解除安裝模組
- opreport使用 http://oprofile.sourceforge.net/doc/opreport.html
- opannotate使用 http://oprofile.sourceforge.net/doc/opannotate.html
- opgprof使用 http://oprofile.sourceforge.net/doc/opgprof.html
- opreport -l /bin/bash --exclude-depand --threshold 1 , 用來發現系統瓶頸。
- opannotate --source --output-dir=annotated /usr/local/oprofile-pp/bin/oprofiled
- opannotate --source --base-dirs=/tmp/build/libfoo/ --search-dirs=/home/user/libfoo/ --output-dir=annotated/ /lib/libfoo.so
- gprof 使用者手冊 http://sourceware.org/binutils/docs-2.17/gprof/index.html
- oprofile官方站點 http://oprofile.sourceforge.net/
- 使用 GNU profiler 來提高程式碼執行速度 http://www-128.ibm.com/developerworks/cn/linux/l-gnuprof.html
- 使用 OProfile for Linux on POWER 識別效能瓶頸 http://www-128.ibm.com/developerworks/cn/linux/l-pow-oprofile/
相關文章
- 使用 sar 和 kSar 來發現 Linux 效能瓶頸Linux
- 五個容易錯過的 PostgreSQL 查詢效能瓶頸SQL
- Android高階開發突破瓶頸Android
- Linux命令----分析系統I/O的瓶頸Linux
- Linux C++ 開發9 - 手把手教你使用gprof效能分析工具LinuxC++
- 高併發下log4j的效能瓶頸
- 在Linux中,如何進行系統效能瓶頸分析?Linux
- 效能測試瓶頸調優
- 使用chrome開發者工具中的performance皮膚解決效能瓶頸ChromeORM
- 高階查詢
- Linux基礎命令---host域名查詢工具Linux
- Linux高階命令Linux
- 理解索引(中):MySQL查詢過程和高階查詢索引MySql
- 如何正確定義效能瓶頸
- 用 pprof 找出程式碼效能瓶頸
- 利用PerfDog分析遊戲效能瓶頸遊戲
- Chrome執行時效能瓶頸分析Chrome
- ❖ MongoDB 高階查詢MongoDB
- Mongodb高階查詢MongoDB
- SQL高階查詢SQL
- 效能課堂-TPS 瓶頸精準定位
- LightDB資料庫效能瓶頸分析(一)資料庫
- 資料庫高階查詢之子查詢資料庫
- 前端如何快速進階,突破技術瓶頸?前端
- 漫談前端效能 突破 React 應用瓶頸前端React
- 效能測試-服務端瓶頸分析思路服務端
- 2020.10.6 效能課堂筆記-cpu 瓶頸分析筆記
- 實用技巧:快速定位Zuul的效能瓶頸Zuul
- I/O已經不再是效能瓶頸
- 突破效能瓶頸,實現流程自動化
- Linux系列之查詢命令Linux
- mysql高階查詢語句MySql
- Hive高階操作-查詢操作Hive
- sql-server高階查詢SQLServer
- 如何使用 Wireshark 分析 TCP 吞吐瓶頸TCP
- SQL Server 資料庫 最佳化 效能瓶頸SQLServer資料庫
- linux下查詢命令的技巧Linux
- linux 查詢檔案命令 findLinux
- Linux下more命令高階用法Linux