1. 程式人生 > >jmeter實現本地控制端通過分散式遠端伺服器(Linux)併發效能測試

jmeter實現本地控制端通過分散式遠端伺服器(Linux)併發效能測試

一、背景:

  1. 之前在Jmeter外掛監控伺服器效能一篇中說到,在非GUI環境中監控時為了儲存監控資料需要修改jmeter指令碼,並且每次通過施壓機(遠端伺服器,非GUI環境)來壓測時都要將jmeter指令碼上傳然後在伺服器上通過命令列啟動,測試完成後再把結果資料下載到本地GUI環境中檢視,總是有很多不方便。
  2. 本次壓測需求需要很大的併發量,例如3000,但是單臺施壓機難以實現,因此希望多臺施壓機並行,並且我能同步控制它們。
  3. 在這樣的需求下經過了解,jmeter工具本身有一個很強大的遠端啟動功能,於是嘗試了一下。

二、jmeter分散式原理

  1. 這個遠端啟動,網上說的高大上一點,就是jmeter的分散式控制~ 具體控制如下圖:

2.客戶端機器作為一個控制器controller,控制多臺slave機器的操作。

3.controller通過GUI介面啟動slave機器,將jmeter壓測傳送給每臺啟動的slave,slave獲得指令碼後開始執行。slave本地不需預先儲存指令碼;

4.各臺slave執行完成後,將結果傳回給controller,controller收集整合顯示。

三、jmeter遠端啟動配置

伺服器(slave)配置

  1. 伺服器(slave)需安裝jmeter,最好與客戶端(controller)保持同版本,jdk最好也保持同版本,無法滿足時至少保證伺服器上的jmeter能正常執行(如jmeter3.0以後需要jdk1.7及以上版本)。
  2. 在slave的%JMETER_HOME%bin目錄下執行./jmeter-server命令啟動jmeter服務就可以,啟動成功如下圖:

3.注意:上圖紅框中的ip為伺服器的ip地址,當伺服器有多網絡卡時它會隨機挑選一個網絡卡使用,紅框中的埠號port為啟動jmeter服務監聽的port,一般會有個預設埠號1099,但最好自定義,確保埠號不衝突。修改方法在下文介紹。

客戶端(controller)配置

  1. 在客戶端上要保證執行命令能傳送到伺服器,因此需配置客戶端遠端的ip地址和port。在客戶端安裝目錄的bin資料夾下,找到jmeter.properties,修改配置如下圖,其中ip和port即為上一步slave的ip和port,如上圖中jmeter-server啟動時紅框中顯示的內容。多個slave機器的配置可通過逗號分隔。

    remote_hosts=10.165.124.6:1029
  2. 配置完成後開啟客戶端jmeter的GUI介面,在執行-遠端啟動中即可看到自己配置的slave機器。

3.新增一個指令碼,點選遠端啟動即可啟動執行slave機器,此時在伺服器上可看到控制檯資訊,在客戶端通過監聽器-聚合報告或察看結果數可看到執行結果。

四、問題

slave機器的自定義埠號配置

  1. 在slave機器的%JMETER_HOME%bin目錄下找到jmeter.properties,修改如下兩項配置,即可自定義埠號:

    server_port=1029
    server.rmi.localport=1029
  2. 修改後執行服務端的jmeter-server即可看到控制檯訊息中修改是否生效;修改生效後需在客戶端修改相應的jmeter.properties下的remote_hosts。

slave機器和客服端多網絡卡的問題

  1. 我在執行過程中slave機器的jmeter-server.log和客戶端的jmeter.log中均報錯提示connect refused。經過檢查後發現伺服器上有2個網絡卡,客戶端有兩個網絡卡,兩臺機器通過vpn在內網環境通訊。而jmeter在遠端通訊的時候是隨機選擇一個網絡卡的ip,這樣很容易導致連線不成功。
  2. 可通過如下配置指定伺服器和客戶端的網絡卡,在伺服器端的jmeter-server檔案中,修改配置指定伺服器端的網絡卡ip

    RMI_HOST_DEF=-Djava.rmi.server.hostname=10.165.124.6

    在客戶端的jmeter.bat中修改配置指定客戶端的網絡卡ip

    增加配置項:set rmi_host=-Djava.rmi.server.hostname=10.165.120.4
    修改配置項:set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %CLASS_UNLOAD% %DDRAW% %rmi_host%
  3. 在修改配置後嘗試遠端啟動,發現還是不成功,開啟客戶端jmeter.log,發現客戶端傳送成功;開啟伺服器端的jmeter-server.log顯示伺服器連線客戶端不成功,嘗試ping了一下也確實ping不通,然後網上搜了一下說是因為客戶端的防火牆阻止了,關閉客戶端所有防火牆,再次執行,測試成功。

依賴檔案報錯的問題

  1. 當jmeter指令碼中需要依賴csv等資料檔案時,該檔案需上傳至伺服器,並需要設定正確的路徑。

附1:

Linux安裝JDK:

0.下載jdk8

登入網址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
選擇對應jdk版本下載。(可在Windows下下載完成後,通過資料夾共享到Linux上)
 

1. 登入Linux,切換到root使用者

su root 獲取root使用者許可權,當前工作目錄不變(需要root密碼)

sudo -i 不需要root密碼直接切換成root(需要當前使用者密碼)

2. 在usr目錄下建立java安裝目錄

cd /usr
mkdir java

3.將jdk-8u60-linux-x64.tar.gz拷貝到java目錄下

cp /mnt/hgfs/linux/jdk-8u60-linux-x64.tar.gz /usr/java/

4.解壓jdk到當前目錄

tar -zxvf jdk-8u60-linux-x64.tar.gz
得到資料夾 jdk1.8.0_60

5.安裝完畢為他建立一個連結以節省目錄長度

(我沒用這一步)
ln -s /usr/java/jdk1.8.0_60/ /usr/jdk

6.編輯配置檔案,配置環境變數

vim /etc/profile
新增如下內容:JAVA_HOME根據實際目錄來
JAVA_HOME=/usr/java/jdk1.8.0_60
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH

7.重啟機器或執行命令 :source /etc/profile

sudo shutdown -r now
 

8.檢視安裝情況

java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) Client VM (build 25.60-b23, mixed mode)

可能出現的錯誤資訊:

bash: ./java: cannot execute binary file

出現這個錯誤的原因可能是在32位的作業系統上安裝了64位的jdk,
檢視jdk版本和Linux版本位數是否一致。
檢視你安裝的Ubuntu是32位還是64位系統:
sudo uname --m
i686 //表示是32位
x86_64 // 表示是64位

附2:

Linux安裝jmeter:

1.上傳jmeter 的壓縮包到Linux

解壓檔案

unzip  apache-jmeter-3.0,zip

移動檔案

mv apache-jmeter-3.0  /data

配置設定

vi /etc/profile

新增

export JMETER_HOME=/data /apache-jmeter-3.0.

export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH

export PATH=$JMETER_HOME/bin:$PATH:$HOME/bin

參考

重新執行剛修改文件

source /etc/profile

修改成功輸入

jmeter -–version

更改許可權

chmod a+x /data/apache-jmeter-3.0/bin/jmeter

問題2:

報錯:Cannot start. Unable to get local host IP address. is a loopback address

在Windows下啟動Jmeter非常順利,轉到Linux下居然啟動失敗。根據丟擲的異常的資訊來看,這個跟ip有關。 
不出意料,果然是這個問題。 

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 


根據異常的大意可知,應該是hostname與localhost不一致導致的,所以,使用hostname命令檢視使用者名稱,果然是不一致的我linux機器的hostname為v3因此將上述改為下面的就可以了。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
10.2.250.203 v3.rdev.tal.net v3 
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 

注意:10.2.250.203 v3.rdev.tal.net v3為你的IP地址(10.2.250.203)加你的hostname(v3.rdev.tal.net)

由/etc/hosts檔案導致啟動失敗的錯誤有:

1,
Created remote object: UnicastServerRef [liveRef: [endpoint:[10.20.10.31:38796](local),objID:[-b0d822e:12794fee8b1:-7fff, 8314597152635832475]]]
Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address.
2,
Created remote object: UnicastServerRef [liveRef: [endpoint:[10.20.10.31:38796](local),objID:[-b0d822e:12794fee8b1:-7fff, 8314597152635832475]]]
Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address.

附3:

Windows下配置jmeter環境變數:

1、設定目錄為 D:\apache-jmeter-3.2\

2、新增1個系統變數名JMETER_HOME、變數值輸入 D:\apache-jmeter-3.2\

3、新增1個系統變數名CLASSPATH、變數值輸入%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar; %JMETER_HOME%\lib\jorphan.jar; 

4、在變數path後面加上%JMETER_HOME%\bin

5、配置完成後輸入: jmeter和jmeter –v測試一下是否配置正確!

ps:配置環境變數後可以使用相對路徑引用引數檔案,如:..\datas\CommissionDatas_onlyoneuser.csv

ps:csv檔案編碼更改:1、首先,將.csv檔案儲存一下。然後滑鼠右擊開啟方式記事本。2、然後,以記事本的方式打開了。檔案-另存為 這時彈出一個視窗,右下方,編碼,這時候你就可以選擇自己想要的編碼格式,然後儲存,就是這麼簡單