1. 程式人生 > >Linux伺服器效能測試工具介紹

Linux伺服器效能測試工具介紹

前言

作為伺服器開發人員,對效能應該非常的敏感,在伺服器設計和編碼時就應該充分考慮到效能問題,但如果寫出來的程式,或者已經存在的程式在執行中出現了效能問題,我們又如何下手去找出問題並解決呢?這不僅靠的是經驗,還需要藉助一些工具來輔助分析。

本文將以一個例項為樣本,介紹幾款linux下常用的效能分析工具的使用以及各自的優缺點,請注意如無特別說明,本文出現的環境均為linux環境。

Linux下的效能分析工具,最常用的是gprof ,但gprof有它的侷限性,本文將介紹valgrind 以及更加強大的oprofile。

Grof

簡介

Linux下最常用的效能分析工具,相信很多人都用過。

Gprof

是GNU profiler工具。可以顯示程式執行的“flat profile”,包括每個函式的呼叫次數,每個函式消耗的處理器時間。也可以顯示“呼叫圖”,包括函式的呼叫關係,每個函式呼叫花費了多少時間。

使用方法

1.編譯、連結時需加上-g -pg選項,連結時也需要加上,否則生成的效能資料會不對。

2.執行時,需要前臺執行,不能使用fork來進行後臺執行。如果是長時間執行,可以終端下使用screen來執行。

3.結束時,需正常退出,不能kill強行退出。

結果分析

1.程式正常結束時,會在程式的當前目錄下產生gmon.out檔案,使用gprof命令將執行資料報告到result.txt檔案。

2.

檢視report.txt檔案,相應列的含義如下:

%time

函式佔用的時間比例

cumulative seconds

累計時間,包括本身以及子函式消耗的時間

self secnods

函式本身消耗的時間,不包括子函式的時間

calls

函式呼叫次數

self ms/call

每次呼叫函式本身消耗的時間,微秒為單位

total ms/call

總呼叫函式消耗的時間,微秒為單

Name

函式名

3.圖形化報告檔案。
為了更加直觀的檢視效能資料,可以藉助工具將文字的報告生成圖片來檢視。
這裡的工具需要安裝python和dot兩個軟體,以及一個python處理指令碼gprof2dot.py,gprof2dot.py到網上搜索,可以下載到最新版本的。
使用批處理命令如下:

python gprof2dot.py result.txt | dot -Tpng -o  report_gprof.png

生成圖片截圖如下:

從上圖我們可以看到,耗時較大的函式會以較顯眼的顏色標顯,並且可以很直觀的看到函式的呼叫關係及各函式下子函式佔用的比例。

點評

優點:Gprof一般系統自帶,不用安裝,歷史悠久,穩定

缺點:需要重新編譯程式,對多執行緒無法支援(需要打patch),需要程式正常退出(很多伺服器程式可能沒有正常退出的方法)。

Valgrind

簡介

Valgrind是一個GPL的軟體,用於Linux(For x86, amd64 and ppc32)程式的記憶體除錯、記憶體洩漏檢測以及效能分析軟體開發工具
下面看看如何使用valgrind來分析效能。

使用方法

1.Valgrind需要自己安裝,去valgrind官網下載原始碼編譯安裝就可以了。(最新版本3.6.1有bug,需要打個patch,或者去下個老版本的)

2.要測試的程式不需要重新編譯,直接用valgrind執行。
執行結束後,會自動生成名為callgrind.out.xxx的檔案,xxx是程序的pid.

3.valgrind執行程式時,程式不能以daemon的方式執行,如果執行時間很長,可以使用screen來執行。Screen的使用可以google一下,有很多資料。

結果方法

1.Valgrind的結果可以使用callgrind_annotate命令來檢視。

2.還可以藉助上面提到的工具,生成圖片來檢視,效果更好。

Python gprof2dot.py -f callgrind callgrind.out.26204 | dot -Tpng -o  report.png

3.注意:跟gprof資料生成圖片的命令相比,稍微有點變化,執行python指令碼時需要加上引數-f callgrind, 指明是要分析的資料型別是callgrind資料,否則會預設當作是gprof資料來處理。

工具點評

優點:無需編譯程式,使用簡單,直接執行就行,支援stl,支援系統庫函式。

缺點:valgrind程式本身會佔用很多的cpu,導致測試程式本身的併發量上不去。

Oprofile

簡介

效能測試的神器。其結果最為準確,為什麼呢?請看oprofile的測試原理。

其原理是:現在的很多 CPU都提供一個所謂效能計數器的東西(performance counter),大致的原理就是程式可以註冊告訴CPU對什麼event感興趣(比如CPU_CYCLE,CPU經歷了一次時鐘週期),然後CPU在執 行了相應的操作後,就會在效能計數器上加1,這樣程式就可以取出。所以,使用OProfile來定位CPU使用率的問題,就變成了讓oprofile收集 程式執行過程中哪個可執行程式(或是so)中的哪個function,消耗的CPUCYCLE最多。

也就是說我們可以通過收集資料知道哪個程式的哪個函式消耗的cpu時間佔比。這種測試方法結果更符合實際情況。

使用方法

1.準備核心:
Oprofile
需要核心的支援,2.6的linux核心已經支援了這個功能,可以編譯成模組或者直接編譯進核心。一般發行版本是沒有將此項功能編譯進核心的,因此需要手動編譯一個核心版本,將cat /boot/config-`uname -r` | grep OPROFILE
應該有這樣兩行:
CONFIG_HAVE_OPROFILE=y
CONFIG_OPROFILE=m
如果沒有則加上,CONFIG_OPROFILE=m表示編譯成模組,CONFIG_OPROFILE=y表示直接編譯進核心。我一般會選擇直接編譯進核心。使用重新編譯的核心啟動機器,如果oprofile編成了模組,需要載入oprofile模組。

2.安裝oprofile工具:
下載oprofile的daemon程式和工具集,直接上http://oprofile.sourceforge.net/download/ 下載最新的oprofile原始碼包到目標機器上,編譯安裝。注意:安裝時需要root許可權。

3.設定oprofile引數。
Oprofile是通過設定cpu事件來進行效能測試的,它有一個daemon的程序來啟動和收集相關的效能資料。因此啟動oprofile之前需要先設定一些引數,比如收集的事件名字,抽樣頻率。
Oprofile的設定是通過opcontrol命令來進行的。

首先,配置 OProfile 是否應該監視核心。這是在啟動 OProfile 前唯一所需的配置選項。其它選項都是可選的。
要監視核心,以root使用者身份執行以下命令:

opcontrol --vmlinux=/boot/vmlinux-`uname -r`

要配置 OProfile 不監視核心,以root使用者身份執行以下命令:

opcontrol --no-vmlinux

一般來說,我們做應用程式的效能測試不需要關注核心的效能。另外需要關注cpu的週期事件,因此需要進行如下設定

opcontrol --setup --event=eventname:count:unitmask:kernel:user

這裡解釋一下event引數的各個項的意思:

說明

eventname

要關注的事件名稱,常用的事件名稱及功能如下:

CPU_CLK_UNHALTED: CPU的執行時間,效能測試時最常用的事件
LLC_MISSES: L2 cache失效情況。

DTLB_MISSES: 資料TLB失效情況。
一般做效能測試時只會用到CPU_CLK_UNHALTED。

count

事件抽樣頻率,oprofile並不是對每次事件都進行記錄,而是進行抽樣,每多少次事件進行一次資料收集,如果抽樣太低,會導致事件資料的收集佔用太多的cpu.因此每個事件,oprofile給了一個最小值,每類事件的最小值可以通過opcontrol --list-events查到。

unitmask

事件的掩碼,通過opcontrol --list-events可檢視相應事件的掩碼意義,這裡不細說了。

kernel

是否收集核心的事件。0表示不收集,1表示收集。

user

是否收集使用者的事件。0表示不收集,1表示收集。

對效能測試時,一般使用的設定引數如下:

opcontrol --setup --event=CPU_CLK_UNHALTED:10000:0:0:1

4.編譯測試程式,需要開啟-g引數。

g++ -g -o perf_test perf_test.cpp

5.進行測試。
檢視當前設定的狀態,確保設定正確

opcontrol --status

清除上一次收集的資料

opcontrol --reset

啟動資料收集。

opcontrol --start

執行我們要測試的程式

執行完成後,停止oprofile資料的收集。

opcontrol --stop

結果分析

Oprofile的資料有兩種檢視方式:

1.使用opreport檢視。
檢視到的列說明:

Samples

取樣到的次數

%

佔的百分比

Symbol name

函式名

2.也可以使用工具,生成圖片檢視。
先用opgprof產生Gprof格式的資料。

opgprof ./perf_test

在當前目錄下會生成gmou.out檔案。
       再用gprof生成txt資料

gprof ./perf_test gmon.out >result.txt

把result.txt從伺服器上下載下來,在windows下使用前面介紹的python指令碼生成       圖片

python gprof2dot.py result.txt | dot -Tpng -o  report_gprof.png

生成圖片結果:

工具點評

優點:oprofile是對整個系統的效能進行分析,採用的是硬體計數器,效率高,負載低,且結果準確。

缺點:需要更換核心,需要root許可權。

Perf

簡介

先看下摘自網上的一段介紹:Perf 是用來進行軟體效能分析的工具。通過它,應用程式可以利用PMU,tracepoint 和核心中的特殊計數器來進行效能統計。它不但可以分析指定應用程式的效能問題 (per thread),也可以用來分析核心的效能問題,當然也可以同時分析應用程式碼和核心,從而全面理解應用程式中的效能瓶頸。

簡單來說,perf是一個很強大的軟體效能分析工具,比oprofile更強大。

使用方法

1. 安裝

安裝 perf 非常簡單,只要您有 2.6.31 以上的核心原始碼,那麼進入 tools/perf 目錄然後敲入下面兩個命令即可:

 make

 make install

2. 使用

Perf的使用比oprofile更加簡單並且可以對生產系統的程序進行線上分析

Perf需要root許可權,使用例子:

perf record -e cycles -a -g -p pid

使用ctrl+c中斷效能資料採集,在當前目錄生成perf.data效能資料檔案。

結果分析

同樣perf也有兩種方式來檢視效能資料

1、 使用perf檢視,使用例子

pref report

如果效能資料檔案不在當前目錄下,可用 -i 引數指定檔案路徑

如果需要生成帶呼叫關係的效能分析結果,可在report後加-g引數,但前提是在record時使用了-g引數。

上圖是使用perf report顯示的結果,第一行顯示樣本採集的次數,從第二行開始是按消耗排序的函式。第二列是佔用的比例,比例越高,說明這個函式消耗cpu越多,第三列是程序名,第四列是模組,告訴你是使用者程序還是kernel還是c庫,第五列是函式名。

通過上面的資料,基本上可以定位到程式的效能消耗點在哪裡了,剩下的就是去修改吧。

2、使用工具,生成圖片檢視。

先用perf script生成中間資料。

perf script | gprof2dot.py -f perf | dot -Tpng -o  report_perf.png

至於gprof2dot.py dot這兩個工具前面已經講過了,這裡不再囉嗦了。

生成的圖片示例

是不是很直觀?感謝gprof2dot.py的作者吧

工具點評

Perf是在oprofile的基礎之上改進過來的,無論從易用上來說還是功能上,perf都明顯優於oprofile, 從目前的發展來看,perf肯定會取代oprofile.

Perf的優點:

效能消耗小,所以可以對有效能問題的生產環境都可以線上進行分析。是不是很誘人?

使用簡單。Tlinux原生態就支援了perf,毫無使用成本。並且使用命令也非常簡單。

Oprofile有的優點他都有。

還能分析核心的效能。

總結

上面介紹的四種工具,經過實測,如果核心已經支援了perf, 強烈推薦使用perf.

如果核心不好支援,或者支援麻煩,可考慮使用valgrind進行測試,Gprof可以完全被valgrind代替,且valgrind的結果比gprof更準確全面一些。