一、问题描述
最近在给项目做性能测试,高并发情况下,发现系统内存暴涨,而且吞吐量很低,基本只有100tps。
二、问题分析
原设计中每次指令下发,都会创建一个新的httpclient,开销太大。实际httpclient是一个线程安全的类,全局保留一个即可。
三、解决方案
运用单利模式创建HttpAsyncClients,所有并发线程共用一个HttpAsyncClients对象,设置连接池最大连接数500.
贴上初始化HttpAsyncClients代码:
public class ServiceClient
{
private volatile static CloseableHttpAsyncClient httpclient;
public static CloseableHttpAsyncClient getInstance() throws IOReactorException
{
if (httpclient == null)
synchronized (DaServiceClient.class)
{
if (null == httpclient)
{
ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor();
PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor);
cm.setMaxTotal(500);
httpclient = HttpAsyncClients.custom().setConnectionManager(cm).build();
httpclient.start();
}
}
return httpclient;
}
}
在操作HTTP请求时,直接使用对象httpclient即可。
经过这个优化,2000tps系统也压力很小,内存也不会一直增长。
参考连接:https://www.cnblogs.com/davidwang456/articles/8526964.html