Mac+httpclient高併發配置實例

本人近期在作服務端的壓力測試,在準備測試腳本的過程當中遇到了一些配置方面的問題,在通過查閱資料和對比結果後總結了在Mac電腦配置和httpclient配置上的經驗。分享出來供你們參考。(備註:Science Internet),如下部分解決方案源於Google搜索結果和httpclient官方文檔。html

首先在Mac上的上遇到問題是大量端口處於TIME_WAIT狀態,這裏先不說代碼層面的,具體的配置以下:java

下面是修改Mac可用最大鏈接數和使用端口的相關參數:apache

sudo sysctl -w kern.maxfiles=1048600     最大鏈接數
sudo sysctl -w kern.maxfilesperproc=1048576  單進程最大鏈接數

注意單進程與單線程不同。下面是設置端口的:編程

net.inet.ip.portrange.first: 10240   起始值 
 
net.inet.ip.portrange.last: 65535   結束值

還有一個關於臨時端口的設置:json

sysctl -w net.inet.ip.portrange.hifirst = 16384 
sysctl -w net.inet.ip.portrange.first = 16384

這個配置容許使用49151個端口,與上面那個設置略有衝突但不影響,有興趣童鞋能夠去原貼看看。傳送門api

下面是httpclient設置:多線程

目前我一共查閱了幾種方案,一一嘗試了一下,說一下結果:併發

第一種設置request請求頭的,具體代碼以下:框架

method.setRequestHeader("Connection", "close");

還有一個設置kipeAlive屬性的,這裏就不發代碼了,由於我看到這個方法的代碼裏面用的仍是SimpleHttpConnectionManager鏈接池管理類,而我用的4.5已經不推薦這個了,如今用的是PoolingHttpClientConnectionManager類,因此抱有一絲疑惑。在實際的使用中,並無發現對鏈接池性能有特別明顯的提高。故而放棄了這個方法。ide

第二種是在設置request.releaseConnection()方法。

method.releaseConnection()

這個方法跟上一個也出出如今httpclient較早的版本里面的,可是並未說不推薦了,這個方法資料比較少。實際使用效果來講會致使一部分的SocketException,好比超時,好比關閉之類的。故而直接放棄掉了,在普通接口測試中並未比較區別。有興趣的童鞋能夠嘗試一下,但願能告知答案。

第三種是本身定時執行連接的回收,用的是httpclient官方給出的方法寫了一個多線程類:

public class GCThread extends Thread {
	private static boolean flag = true;
 
	@Override
	public void run() {
		while (flag) {
			SourceCode.sleep(1);
			ApiLibrary.recyclingConnection();
		}
	}
 
	public static void stopThread() {
		flag = false;
	}
}

設置完上面這些剩下的就是httpclient的相關設置了,本人總結了一下,大概兩個方面:鏈接池設置和超時設置。

鏈接池設置:

此處解釋下MaxtTotal和DefaultMaxPerRoute的區別:
		一、MaxtTotal是整個池子的大小;
		二、DefaultMaxPerRoute是根據鏈接到的主機對MaxTotal的一個細分;好比:
		MaxtTotal=400 DefaultMaxPerRoute=200
		只鏈接到某個網站時,到這個主機的併發最多隻有200;而不是400;
		每一個主機的併發最多隻有200;即加起來是400(但不能超過400);因此起做用的設置是DefaultMaxPerRoute。*/
		connManager.setMaxTotal(MAX_TOTAL_CONNECTION);
		connManager.setDefaultMaxPerRoute(MAX_PER_ROUTE_CONNECTION);

超時設置: RequestConfig.custom().setConnectionRequestTimeout(CONNECT_REQUEST_TIMEOUT).setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).setCookieSpec(CookieSpecs.STANDARD).build();
附上還httpclient官方文檔地址:傳送門

我用的httpclient4.5.5的包,本機iMac,併發超過20k,暫時未見到本機的瓶頸。但願能對各位有點幫助。

往期文章精選

  1. java一行代碼打印心形
  2. Linux性能監控軟件netdata中文漢化版
  3. 接口測試代碼覆蓋率(jacoco)方案分享
  4. 性能測試框架
  5. 如何在Linux命令行界面愉快進行性能測試
  6. 圖解HTTP腦圖
  7. 寫給全部人的編程思惟
  8. 測試之JVM命令腦圖
  9. 將json數據格式化輸出到控制檯
  10. 如何測試機率型業務接口
  11. 「雙花」BUG的測試分享
  12. 將swagger文檔自動變成測試代碼
  13. Mac+httpclient高併發配置實例

公衆號地圖 ☢️ 一塊兒來~FunTester

相關文章
相關標籤/搜索