关于Nacos grpc大量创建线程
问题:
VM观察发现nacos-grpc-client-executor-XX-id线程被大量创建
源码解析:
protected ThreadPoolExecutor createGrpcExecutor(String serverIp) {
// Thread name will use String.format, ipv6 maybe contain special word %, so handle it first.
serverIp = serverIp.replaceAll("%", "-");
ThreadPoolExecutor grpcExecutor = new ThreadPoolExecutor(clientConfig.threadPoolCoreSize(),
clientConfig.threadPoolMaxSize(), clientConfig.threadPoolKeepAlive(), TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(clientConfig.threadPoolQueueSize()),
new ThreadFactoryBuilder().daemon(true).nameFormat("nacos-grpc-client-executor-" + serverIp + "-%d")
.build());
//官方采用了干核心线程策略
grpcExecutor.allowCoreThreadTimeOut(true);
return grpcExecutor;
}
分析出现的原因:
未对grpc做任何参数调整的情况下,grpc的线程池默认大小为:
threadPoolCoreSize:32
threadPoolMaxSize:128
由于线程池的策略与任务不饱和,导致核心线程闲置就kill,偶尔来个任务就创建
解决问题,启动参数添加:
-Dnacos.remote.client.grpc.pool.core.size=1