1 工作线程数
JFinal对工作线程数做了一层包装,通过UndertowConfig来配置,配置会覆盖到原生Undertow的Builder里面;
1)优先取配置文件;
2)开发环境,受限制,workerThreads=4;ioThreads=2;
3)生产环境,ioThreads=Math.round(cpuNum * 1.6180339);workerThreads=ioThreads * 16;
# 注意
# 是否开发模式:true 值支持热加载,生产环境建议配置成 false(会影响工作线程数)
undertow.devMode=true
2 bufferSize配置按默认就行
// 官方Undertow.java计算如下
private Builder() {
ioThreads = Math.max(Runtime.getRuntime().availableProcessors(), 2); // 2~CPU核心数
workerThreads = ioThreads * 8; // 工作线程是ioThreads的8倍
long maxMemory = Runtime.getRuntime().maxMemory();
//smaller than 64mb of ram we use 512b buffers
if (maxMemory < 64 * 1024 * 1024) { // 内存<64M
//use 512b buffers
directBuffers = false;
bufferSize = 512;
} else if (maxMemory < 128 * 1024 * 1024) { // // 内存<128M
//use 1k buffers
directBuffers = true;
bufferSize = 1024;
} else { // 内存>128M
//use 16k buffers for best performance
//as 16k is generally the max amount of data that can be sent in a single write() call
directBuffers = true;
bufferSize = 1024 * 16 - 20; //the 20 is to allow some space for protocol headers, see UNDERTOW-1209
}
}
3 小结
一般来说,ioThreads、workerThreads是不用设置的,按照默认就行了;生产环境记得把undertow.devMode=true配置打开;
增加线程数,系统通道吞吐量就一定能上去吗?不是的,CPU处理有极限,线程数量上去,CPU不一定处理的了;从网上资料看,对Tomcat压测结果显示200个线程跟5000个线程执行的结果是差不多的;所以,吞吐量更多的是跟后端业务处理时长有关系;