LinuxCNC性能剖析
系統級性能優化通常包括兩個階段:性能剖析(performance profiling)和代碼優化。
性能剖析的目標是尋找性能瓶頸,查找引發性能問題的原因及熱點代碼。代碼優化的目標是針對具體性能問題而優化代碼或編譯選項,以改善軟件性能。
在性能剖析階段,需要借助于現有的 profiling 工具,探測相關模塊的熱點路徑、耗時統計和占比。在代碼優化階段往往需要借助開發者的經驗,編寫簡潔高效的代碼,甚至在匯編級別合理使用各種指令,合理安排各種指令的執行順序。
本文主要講述性能剖析的方法,在這方面,Linux 操作系統自帶了多種靈活又具有針對性的工具,此外一些廠家也開源了不少優秀的性能分析工具。下面介紹幾種主流工具的使用方法。
perf
perf簡介
perf 是 google 提供的一款強大的性能分析工具,它被廣泛應用在內核和應用程序的性能分析當中。
Linux 性能計數器是一個新的基于內核的子系統,它提供一個性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和軟件(軟件計數器、tracepoint)功能。通過 perf,應用程序可以利用 PMU、tracepoint 和內核中的計數器來進行性能統計。
perf安裝
在終端中輸入 perf,如果提示 perf 的用法,則表明 perf 已經安裝。如果提示命令未找到
$ perf /usr/bin/perf: line 24: exec: perf_3.4: not found E: linux-tools-3.4 is not installed.由于 perf 命令包含在 linux-tools 包中,因此先查詢其版本
$ apt-cache search linux-tools linux-tools - Performance analysis tools for Linux (meta-package) linux-tools-2.6 - Performance analysis tools for Linux (dummy package) linux-tools-3.2 - Performance analysis tools for Linux 3.2 linux-tools-3.4 - Performance analysis tools for Linux 3.4如果存在對應版本的 linux-tools 包,則直接安裝即可
$ sudo apt-get install linux-tools-3.4如果沒有對應版本的 linux-tools,則可下載安裝最新版本的 linux-tools-x.x,然后修改文件 /usr/bin/perf,將 exec "perf_$version" "$@" 修改為 exec "perf_x.x" "$@"。
perf使用
假設 linuxcnc 程序的執行腳本在 /usr/linuxcnc2.7.14/scripts 下,則用 perf record 啟動 linuxcnc
$ cd /usr/linuxcnc2.7.14/scripts/ $ sudo perf record -e cpu-clock --call-graph ./linuxcnc軟件啟動后,執行加工,等到自動加工完成后,關閉軟件。在當前目錄下會生成 perf.data,使用 perf report -v -i perf.data,可以看到調用過程和執行時間統計
為了方便查看函數調用的細節,可以將分析報告導出到文件中
root@debian:/usr/linuxcnc2.7.14/scripts# perf report -v -i perf.data > report.log該工具的詳細介紹及其它選項見:https://www.cnblogs.com/arnoldlu/p/6241297.html
oprofile
oprofile簡介
oprofile 庫是 Linux 平臺上的一個功能強大的性能分析工具,支持兩種采樣方式:基于事件的采樣和基于時間的采樣。
oprofile 在 Linux 上分為兩部分,一個是內核模塊(oprofile.ko),一個是用戶空間的守護進程(oprofiled)。
注意事項
oprofile 需要內核的支持,2.6 的 Linux 內核已經支持了這個功能,可以編譯成模塊或者直接編譯進內核。一般發行版本是沒有將此項功能編譯進內核的,因此需要手動編譯一個內核版本,
$ cat /boot/config-`uname -r` | grep OPROFILE CONFIG_OPROFILE=m CONFIG_HAVE_OPROFILE=y如果沒有則加上,CONFIG_OPROFILE=m 表示編譯成模塊,CONFIG_OPROFILE=y 表示直接編譯進內核。如果 oprofile 編成了模塊,則需要加載 oprofile 模塊。
oprofile安裝
直接到 http://oprofile.sourceforge.net/download/ 下載 oprofile 源碼包到目標機器上,編譯并安裝。注意:安裝時需要 root 權限。
$ sudo ./configure $ sudo make $ sudo make install如果要卸載 oprofile,請執行如下命令
$ sudo make uninstall版本說明
在 1.0 版本以前,oprofile 使用腳本命令 opcontrol 和 oprofiled 守護進程進行采樣分析;在 0.9.8 版本,其被棄用,并引入 operf 工具進行采樣分析。
一些舊的處理器和平臺可能不支持 operf,運行 operf 會得到類似如下的提示信息
$ operf Your kernel's Performance Events Subsystem does not support your processor type Please use the opcontrol command instead of operf.這時應該安裝包含 opcontrol 和 oprofiled 的最新版本 0.9.9。
依賴庫缺失
在執行 sudo ./configure 時,如果提示依賴庫缺失
$ sudo ./configure ...... configure: error: liberty library not found庫 liberty 包含在 binutils-dev 包中,安裝包
$ sudo apt-get install binutils-devoprofile使用
由于沒有實體機做實驗,這里只能用虛擬機代替,并且使用 opcontrol 命令進行演示。
- 加載內核模塊
- 設置監視內核
第一次調用 opcontrol 時,必須告訴它想統計內核還是用戶空間數據,由于沒有可供調試的內核,因此用 --no-vmlinux 選項來取消內核統計
# opcontrol --no-vmlinux- 利用 oprofile 進行數據收集
- 查看結果
可能是由于虛擬機或內核的緣故,這里用 oprofile 沒有監測出應用程序的性能指數,如下圖所示
疑難問題
如果啟動 opcontrol --start 時,提示如下信息
# opcontrol --start Cannot find event CPU_CLK_UNHALTED Using default event: CPU_CLK_UNHALTED:100000:0:1:1 Cannot find event CPU_CLK_UNHALTED則表明當前 CPU 不被 oprofile 識別,或者識別有問題,此時需進行基于時間的采樣,在加載內核模塊時強制使用 timer=1
# modprobe oprofile timer=1總結
以上是生活随笔為你收集整理的LinuxCNC性能剖析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高标清双向变换 万能 视频格式转换器
- 下一篇: 人工智能、深度学习和AIoT