FunTester Mac+httpclient 高并发配置实例

FunTester · 2020年03月31日 · 1287 次阅读

本人近期在做服务端的压力测试,在准备测试脚本的过程中遇到了一些配置方面的问题,在经过查阅资料和对比结果后总结了在 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,暂时未见到本机的瓶颈。希望能对各位有点帮助。

往期文章精选

  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 高并发配置实例

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册