本人近期在做服务端的压力测试,在准备测试脚本的过程中遇到了一些配置方面的问题,在经过查阅资料和对比结果后总结了在 Mac 电脑配置和 httpclient 配置上的经验。分享出来供大家参考。(备注:Science Internet),以下部分解决方案源于 Google 搜索结果和 httpclient 官方文档。
首先在 Mac 上的上遇到问题是大量端口处于 TIME_WAIT 状态,这里先不说代码层面的,具体的配置如下:
下面是修改 Mac 可用最大连接数和使用端口的相关参数:
sudo sysctl -w kern.maxfiles=1048600 最大连接数
sudo sysctl -w kern.maxfilesperproc=1048576 单进程最大连接数
注意单进程与单线程不一样。下面是设置端口的:
net.inet.ip.portrange.first: 10240 起始值
net.inet.ip.portrange.last: 65535 结束值
还有一个关于临时端口的设置:
sysctl -w net.inet.ip.portrange.hifirst = 16384
sysctl -w net.inet.ip.portrange.first = 16384
这个配置允许使用 49151 个端口,与上面那个设置略有冲突但不影响,有兴趣童鞋可以去原贴看看。传送门
下面是 httpclient 设置:
目前我一共查阅了几种方案,一一尝试了一下,说一下结果:
第一种设置 request 请求头的,具体代码如下:
method.setRequestHeader("Connection", "close");
还有一个设置 kipeAlive 属性的,这里就不发代码了,因为我看到这个方法的代码里面用的还是 SimpleHttpConnectionManager 连接池管理类,而我用的 4.5 已经不推荐这个了,现在用的是 PoolingHttpClientConnectionManager 类,所以抱有一丝疑惑。在实际的使用中,并没有发现对连接池性能有特别明显的提升。故而放弃了这个方法。
第二种是在设置 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的区别:
1、MaxtTotal是整个池子的大小;
2、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,暂时未见到本机的瓶颈。希望能对各位有点帮助。