2015-05-27 156 views
0

我目前正在嘗試加載測試服務器。由於我的控制以外的問題,我不能使用Jmeter進行測試。創建一組線程並讓每個線程在同一時刻發送帖子或儘可能接近發送帖子的最佳方式是什麼?在運行發送到POST到服務器的方法之前,我的當前實現創建了一些帶有for循環的線程。但這根本不是同時發生的。如何發送並行POST請求Java

+2

我不明白jmeter與體系結構的關係 – njzk2

+0

如果您從外部負載測試服務器(模擬HTTP流量),則應該如何生成流量。那麼爲什麼JMeter沒有這個問題呢? –

+0

我不能具體說。但是我有一種處理jmeter不能做的數據的方法。這不是重要的部分。 – drpogue

回答

3

我說你會想在羣集中做到這一點,而不是在同一臺機器上的多個線程,除非你有一臺機器與幾個網絡接口卡(NIC)。你的瓶頸不是內核,它是你的網卡。您的網卡仍然會依次清空其緩衝區。

我會推薦的是有儘可能多的機器集羣,你可以。在每臺機器上,都有一對線程(只是爲了確保NIC的緩衝區保持滿)。不要麻煩同步集羣同時發送請求,因爲往返時間(RTT)將花費太長時間,並且會使您的負載測試無效。只需要將每個線程錘掉......從統計角度來講,如果您的羣集足夠大,則必定會同時獲得幾個POST請求。

+0

假設存在任何瘋狂的原因,我不能使用預先存在的加載應用程序,這是我會用我將創建的應用程序做什麼。將罐子放在儘可能多的機器上,並行運行。 – MadConan

+0

一個網卡一次只能處理一個連接到主機的連接? – MadConan

+0

一個網卡有一個緩衝區,你可以儘可能快地填充它,但它只能清空緩衝區才能順序發送數據包。服務器通過擁有多個網卡來解決這個問題 - 不是我是一個服務器大師或其他任何東西 – searchengine27

0

我肯定會推薦使用一些負載測試應用程序框架。有很多可供選擇的。

就這樣說,你可以使用這樣的事情開始。這將是我從哪裏開始。您需要實施performRequest方法。至少可以這樣說,這並不是很強大。沒有日誌記錄,沒有報告沒有錯誤處理 - 你可以通過一個負載測試應用程序「免費」獲得所有這些(對於「免費」的某些定義)。

public class HttpClient { 
    enum RequestType{ 
     POST,GET 
    } 

    private RequestType type; 
    private String url; 

    public HttpClient(RequestType rt, String url){ 
     type = rt; 
     this.url = url; 
    } 

    public void performRequest(){ 
     // your code here. 
    } 

    public static void main(String[] args){ 
     List<HttpClient> clients = new ArrayList<>(); 
     int clientCount = Integer.parseInt(args[0]); 
     String url = args[1]; 
     for(int i=0; i<clientCount; i++){ 
      clients.add(new HttpClient(RequestType.POST,url)); 
     } 
     clients.parallelStream().forEach(HttpClient::performRequest); 
    } 
} 

你可能想使

  • 默認的線程池的一些顯着的改進是非常小的。它等於系統上的CPU核心數量。創建自己的ForkJoinPool實例將爲您提供更好的控制。
  • 移動到一個單獨的類來啓動和解析參數會好得多。
1

假設你的問題是關於同步你的線程,而不是創建/運行線程,那麼我推薦CountDownLatch。鏈接中的示例非常棒。

+0

除非我誤解了,否則OP會詢問POST請求的負載測試。所有的客戶端請求應該是自治的,並且服務器應該已經被功能測試。因此,不會考慮同步。 – MadConan

+0

「我的當前實現在運行發送到服務器的POST方法之前創建了一個帶for循環的線程,但這根本不是併發的。」聽起來像同步問題。 –

+0

好的,我可以看到,如果他在某些共享連接或其他什麼上進行同步,但在線程之間根本不應該有任何共享資源,因此我說它不處理同步。 – MadConan