本人近期在作服務端的壓力測試,在準備測試腳本的過程當中遇到了一些配置方面的問題,在通過查閱資料和對比結果後總結了在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,暫時未見到本機的瓶頸。但願能對各位有點幫助。