最近根據公司工做的需求,學習了一些壓力測試的知識,目前,公司使用的是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文件中,下次再跟你們一塊兒分享下這個小腳本,但願大神給我指點!!!!
謝謝你們看完本博。喜歡就點個贊吧,轉載請註明出處!