JMeter是Apache組織的開放源代碼項目,它是功能和性能測試的工具,100%的用java實現。JMeter能夠用於測試靜態或者動態資源的性能(文件、Servlets、Perl腳本、java對象、數據庫和查詢、ftp服務器或者其餘的資源)。JMeter用於模擬在服務器、網絡或者其餘對象上附加高負載以測試他們提供服務的受壓能力,或者分析他們提供的服務在不一樣負載條件下的總性能狀況。 java
進入JMeter的bin目錄,而後執行: 數據庫
sudo ./jmeter.sh
在沒有使用JMeter前,我對hetty的性能測試,都是經過本身寫多線程代碼去完成的,至關苦逼,至關麻煩,不過也能鍛鍊本身的編碼能力,我先貼出比較原始的測試方法,以下: api
public class RpcHessianClient { public static void main(String[] args) { String url = "http://localhost:8081/apis/hello"; HessianProxyFactory factory = new HessianProxyFactory(); ExecutorService es = Executors.newFixedThreadPool(10); int size = 1000000; final CountDownLatch cdl = new CountDownLatch(size); try { long start = System.currentTimeMillis(); factory.setUser("client1"); factory.setPassword("client1"); factory.setOverloadEnabled(true); final Hello basic = (Hello) factory.create(Hello.class, url); for (int i = 0; i < size; i++) { es.submit(new Runnable() { @Override public void run() { String u=basic.hello("guolei"); //System.out.println(u); cdl.countDown(); } }); } cdl.await(); long time = System.currentTimeMillis() - start; System.out.println("SayHello:"); System.out.println("耗時:" + (double) time / 1000 + " s"); System.out.println("平均:" + ((double) time) / size +" ms"); System.out.println("TPS:" + (double) size / ((double) time / 1000)); // System.out.println("Hello, " + s.getMail()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }finally{ es.shutdown(); } } }
咱們要使用JMeter來測試hetty,因爲hetty是一款基於hessian和netty的RPC產品,咱們必須使用JMeter的JAVA請求功能來進行測試,Java請求是指JMeter對Java Class進行性能測試。首先咱們須要編寫測試用例: 服務器
1)新建JAVA工程。 網絡
2)引入ApacheJMeter_java.jar 、ApacheJMeter_core.jar以及測試所須要的jar(jar包在JMeter目錄的lib/ext目錄中)。 多線程
3)繼承AbstractJavaSamplerClient類開始編寫主業務。以下: ide
public class HettyTest extends AbstractJavaSamplerClient { private static String label = "hettyTest"; /** * 執行runTest()方法前會調用此方法,可放一些初始化代碼 */ public void setupTest(JavaSamplerContext arg0) { } /** * JMeter測試用例入口 */ public SampleResult runTest(JavaSamplerContext arg0) { SampleResult sr = new SampleResult(); sr.setSampleLabel(label); try { // 這裏調用咱們要測試的java類,這裏我調用的是一個Test類 Map<String,String> map = getDefaultParameters().getArgumentsAsMap(); sr.sampleStart(); // 記錄程序執行時間,以及執行結果 Test.execute(map.get("ip"),map.get("port")); sr.sampleEnd(); sr.setSuccessful(true); } catch (Throwable e) { sr.setSamplerData(e.getMessage()); e.printStackTrace(); sr.setSuccessful(false); // 用於設置運行結果的成功或失敗,若是是"false"則表示結果失敗,不然則表示成功 } return sr; } /** * JMeter界面中可手工輸入參數,代碼裏面經過此方法獲取 */ public Arguments getDefaultParameters() { Arguments args = new Arguments(); args.addArgument("ip", "localhost"); args.addArgument("port", "8081"); return args; } /** * 執行runTest()方法後會調用此方法. */ public void teardownTest(JavaSamplerContext arg0) { } }Test類是我測試邏輯,以下:
public class Test { public static void execute(String ip,String port) throws MalformedURLException { String url = "http://"+ip+":"+port+"/apis/hello"; HessianProxyFactory factory = new HessianProxyFactory(); factory.setUser("client1"); factory.setPassword("client1"); factory.setOverloadEnabled(true); final Hello basic = (Hello) factory.create(Hello.class, url); //System.out.println("SayHello:" + basic.hello("guolei")); } }
代碼中都有註釋,按照註釋實際操做去理解。 System.out等的輸出會顯示在啓動JMeter時的命令窗口內,但過多的輸出會影響性能的準確性。 工具
4)將項目打爲jar包,放到JMeter目錄下的lib/ext下(將項目依賴的jar也放到此目錄)。
性能
5)重啓JMeter。 測試
1)選中主界面左側的「測試計劃」,右鍵菜單->添加->Threads(Users)->線程組。
2)再選中剛纔新增的"線程組",右鍵菜單->添加->Sampler->Java請求。
3)再選中剛纔新增的"Java請求",右鍵菜單->添加->監視器->聚合報告。
4)Ctrl + R,開始運行, Ctrl + E,清除歷史結果。
聚合報告中基本已經包含咱們所關心的幾個數據了:
Samples -- 本次場景中一共完成了多少個Transaction
Average -- 平均響應時間
Median -- 統計意義上面的響應時間的中值
90% Line -- 全部transaction中90%的transaction的響應時間都小於xx
Min -- 最小響應時間
Max -- 最大響應時間
PS: 以上時間的單位均爲ms
Error -- 出錯率
Troughput -- 吞吐量,單位:transaction/sec
KB/sec -- 以流量作衡量的吞吐量