根据官方documentation,默认的选择器数量等于可用核心数量。
默认的选择器数量等于JVM可用的处理器数量,即使所有使用的连接都在回调任务中执行重要的非阻塞工作,也应该能够实现最佳性能。
但是,查看代码时,默认选择器数量似乎是可用内核数量的一半
public ServerConnector(
@Name("server") Server server,
@Name("executor") Executor executor,
@Name("scheduler") Scheduler scheduler,
@Name("bufferPool") ByteBufferPool bufferPool,
@Name("acceptors") int acceptors,
@Name("selectors") int selectors,
@Name("factories") ConnectionFactory... factories)
{
super(server,executor,scheduler,bufferPool,acceptors,factories);
_manager = newSelectorManager(getExecutor(), getScheduler(),
selectors>0?selectors:Math.max(1,Math.min(4,Runtime.getRuntime().availableProcessors()/2)));
addBean(_manager, true);
setAcceptorPriorityDelta(-2);
}
接受者的数量存在类似的差异。文档状态
默认的接受器任务数是最小值1和可用CPU数量的一半。拥有更多接受器可以减少看到高速率新连接的服务器的延迟(例如,没有保持活动的HTTP / 1.0)。通常,默认值足以用于现代持久性协议(HTTP / 1.1,HTTP / 2等)
但代码说不然
if (acceptors < 0)
acceptors=Math.max(1, Math.min(4,cores/8));
这是处理hyperthreading
还是还有其他原因?即使这是hyperthreading
的原因,接受者的数量应该是cores / 4
。有人可以解释我在这里缺少什么吗?