linux上實現jmeter分佈式壓力測試的完整教程

最近根據公司工做的需求,學習了一些壓力測試的知識,目前,公司使用的是jmeter進行壓力測試。下面就記錄下近期的學習。java

我想將此次的博文分紅三個部分:linux

一、開始測試前的準備(測試環境的搭建)shell

二、在一臺linux上測試apache

三、多臺linux分佈式測試windows

首先來看看測試環境的搭建。我是本身建立的linux虛擬機,因此就用它來講說吧。bash

安裝linux的過程就很少說了,不是本次的重點,有不太明白的朋友,能夠本身去百度下,或者我有一篇文章也大概記錄了個人安裝過程,能夠參考下。服務器

linux安裝好以後,咱們須要安裝jdk,由於jmeter是依賴於jdk運行的。因爲咱們的測試case都是在windows上利用jmeter寫好以後上傳到linux上跑的,因此,爲了不沒必要要的錯誤,windows和linux的jdk和jmeter版本要保持一致。網絡

JDK的安裝併發

找到本身想要的版本,在linux的/usr/下新建一個文件夾,名字本身取,用來放jdk安裝包和安裝jdk使用(我使用的是/usr/java/)。而後將安裝包放到linux的/usr/java/下,而後執行下面命令進行jdk的安裝:負載均衡

tar -zxf <jdk name>

jdk name 就是你要安裝的jdk安裝包,至此,jdk安裝就完成了。爲了節省空間,咱們要把安裝包刪掉,執行下面的命令:

rm -f <jdk name>

-f 指明瞭不須要詢問我,直接刪掉。

接下來,咱們須要配置系統變量,就像windows操做系統中配置環境變量同樣,這裏咱們經過編輯profile文件來配置:

vi /etc/profile

而後按下Ins鍵,當下面出現INSERT時,咱們就能夠進行編輯了。

在文件的後面追加下面幾行內容:

JAVA_HOME=/usr/java/jdk1.8.0_121
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH

內容中的路徑和jdk版本都要換成本身的,這個是筆者的路徑。

添加完以後,按下Esc鍵,退出編輯模式,而後輸入:wq 再按下回車鍵,這樣就將修改的內容保存並退出,爲了讓修改的文件生效,須要執行下面的命令:

source /etc/profile

爲了驗證jdk是否成功安裝,咱們執行下面的命令,若是出現對應的安裝版本信息,則說明安裝成功,不然請檢查安裝和配置。

[root@localhost java]# java -version
java version "1.8.0_121"

Jmeter的安裝

jdk安裝完成,就開始jmeter的安裝了。安裝過程很簡單,跟jdk相似,如今/etc/下建立jmeter文件夾,將安裝包放到/usr/jmeter/下,執行下面命令:

tar -zxf <jmeter package>

安裝好之後,去配置環境變量。依然是修改/etc/profile的內容。添加如下幾行:

JMETER_HOME=/usr/jmeter/apache-jmeter-3.0
CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH
PATH=$JMETER_HOME/bin/:$PATH
export JMETER_HOME CLASSPATH PATH

必定要注意,路徑要換成本身的哦。至此,jmeter也已經安裝完畢啦,咱們能夠執行如下命令要驗證,jmeter是否安裝成功。

jmeter -v

若是正確的安裝,就會出現jmeter的版本相關信息。

執行一條jmeter測試

相信到這裏的朋友,測試環境已經搭建好了。那麼接下來呢,咱們就能夠開始執行第一條測試了。

首先,建立一個文件夾來放測試case,由於我是用虛擬機跟本地windows機器建立了一個共享文件夾,因此爲了方便,我就直接放在該文件夾下了。(/mnt/hgfs/share/jmeterTest)

而後能夠運行下面的命令:

jmeter -n -t test.jmx -l testReport.jtl

jmeter前面咱們已經安裝,jmeter在安裝路徑的bin目錄下。

-n 表示沒有界面的運行

-t 後面緊跟指定的須要運行的測試case(測試case在windows上用jmeter圖形界面事先寫好)

-l 指定了測試報告的文件(也能夠指定路徑,默認在當前目錄下),生成的報告能夠保存到本地windows上在jmeter中打開查看。

須要注意的是:咱們的操做是在root身份下進行的,若是你登錄的是其餘身份的用戶,可能jmeter不具備x(可執行)權限,咱們須要先給它權限。

至此,在linux上經過命令行執行jmeter測試已經成功完成了。可是,對於一個有點兒追求的測試狗來講,這確定是遠遠不夠的。下面咱們就來講下,如何在多臺linux上分佈式執行jmeter測試。

多臺linux分佈式測試

先來理解下分佈式測試原理,看下圖:

一、Jmeter分佈式測試時,選擇其中一臺做爲調度機(master/Controller),其它機器作爲執行機(slave/Agent)。

二、執行時,master會把腳本發送到每臺slave上,slave 拿到腳本後就開始執行,slave執行時不須要啓動GUI,應該是經過命令行模式執行的。

三、執行完成後,slave會把結果回傳給master,master會收集全部slave的信息並彙總。

注意:

(1)每一臺jmeter遠程服務器(slave機器)都執行相同的測試計劃,jmeter不會在執行期間作負載均衡,每一臺服務器都會完整地運行測試計劃;

(2)採用JMeter遠程模式並不會比獨立運行相同數目的非GUI 測試更耗費資源。可是,若是使用大量的JMeter 遠程服務器,可能會致使客戶端過載,或者網絡鏈接發生擁塞;

(3)默認狀況下,master機器是不執行參與生成併發數據的;

(4)調度機(master)和執行機(slave)最好分開,因爲master須要發送信息給slave而且會接收slave回傳回來的測試數據,因此mater自身會有消耗,因此建議單獨用一臺機器做爲mater。

下面開始實施吧。

首先,按照前面安裝jmeter的步驟,在其餘linux上安裝jdk和jmeter(jdk和jmeter的版本以及安裝路徑要保持一致,否則可能會出錯,沒法成功執行)

確保環境搭建完成之後,進入jmeter的安裝目錄,進入bin下,啓動jmeter-server(若是沒有可執行權限,要先添加權限,root用戶沒有權限限制)

全部的slave機器都要啓動jmeter-server,默認端口是1099,能夠經過修改jmeter.properties文件進行修改。回到master機器上,修改jmeter.properties文件中的remote_hosts,將slave機器的ip地址添加上去,多個ip之間用逗號隔開。其中127.0.0.1表示master機器自己,爲了獨立開master,能夠將其去掉,這樣就不會在master上執行測試。

而後在master機器上執行下面的命令:

jmeter -n -t test.jmx -R ip1,ip2,ip3 -l testReport.jtl

其中 -R 指定遠程鏈接的slave機器的ip地址,多個ip之間用逗號隔開。

至此,分佈式jmeter測試也完成了。可是,對,我又要說可是了。頗有可能你不會執行成功(由於我就沒有那麼容易的成功啊!哈哈哈)

那麼問題來了

下面我列舉出一些我在這個過程當中出現的一些錯誤,以及後來的解決辦法。

問題1:

在slava機器上執行jmeter-server的時候,會出現如下的問題:(如下爲本人遇到的問題)

一、出現 XII DISPLAY 這樣的錯誤,能夠先執行下面命令:

echo $DISPLAY

若是內容爲空(我就是內容爲空),那麼,就繼續執行下面的命令:

DISPLAY=:0
#DISPLAY=localhost:0.0

上面兩個均可以

問題2:

jmeter-server啓動失敗。一般有如下兩個錯誤:

一、Unable to get local host IP address

二、xxx is a loopback address

通常上面的兩個問題,都是由host文件引發的,咱們須要修改host文件,能夠執行下面的命令:

vi /etc/hosts

我是將127.0.0.1替換成本機ip地址的。

針對「xxx is a loopback address」這個問題,咱們還能夠經過執行下面的命令來指定ip,從而避免掉該錯誤:

./jmeter-server -Djava.rmi.server.hostname=ip

問題3:

jmeter-server啓動成功,可是在master上沒法執行分佈式測試。

我這邊拋出的錯誤是:」No route to host「

這個問題是由防火牆引發的,也就是說,slave上的防火牆沒有關閉,此時,咱們須要到slave上關掉防火牆。以後就能夠正常運行了。關閉防火牆的方法多種,我這裏特別記錄下我本身紅帽子7虛擬機的命令:

#查看防火牆狀態
systemctl status firewalld
#關閉防火牆
systemctl stop firewalld

好了,整個過程就是這樣的額。

偷偷告訴大家一個事情,由於我是個「懶癌患者」,因此上面這些執行測試的操做,都不要重複去作,因而我就想方法將他們寫到了一個shell文件中,下次再跟你們一塊兒分享下這個小腳本,但願大神給我指點!!!!

謝謝你們看完本博。喜歡就點個贊吧,轉載請註明出處!

相關文章
相關標籤/搜索