CODE-1
new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(),WORKER_SIZE)
CODE-2
OrderedMemoryAwareThreadPoolExecutor executor = new OrderedMemoryAwareThreadPoolExecutor(48, 0, 0, 1, TimeUnit.SECONDS);
pipeline.addLast("executor", new ExecutionHandler(executor));
如果可以从CODE-1设置IO工作线程池大小(默认为2 * cpu计数),那么在CODE-2中向管道添加执行器(线程池)的目的是什么?
IO操作是从工作线程完成的。这是否意味着,连接速度慢或网络不良的客户端会使IO工作线程忙,直到数据完全发送?如果是这样,增加WORKER_SIZE会帮助我防止延迟吗?
答案 0 :(得分:1)
慢速连接通常不会影响NIO中的Netty线程(请查看更新说明)。
有关Netty服务器内部线程的一些观点
默认情况下,每个服务器端口只有一个Boss线程 将接受连接并将连接切换到工作人员 线程。
准确地说:WORKER_SIZE是NioWorker的最大数量 服务器可以拥有的runnables。例如,如果服务器有 只有一个连接,那么将有1个工作线程。如果连接数增加且无法分配给下一个工作人员(活动连接> WORKER_SIZE),则会以循环方式将连接分配给工作人员。
如果可以从CODE-1设置IO工作线程池大小(默认为2 * cpu计数),那么在CODE-2中将执行器(线程池)添加到管道的目的是什么?
如果您的上游任务是阻塞的,那么您应该使用执行处理程序在单独的线程池中执行它们。否则Nio读/写将无法按时工作(延迟?)。我认为拥有一个执行处理程序将有助于减少延迟,而不是将大值设置为WORKER_SIZE。
IO操作是从工作线程完成的。这是否意味着,连接速度慢或网络不良的客户端会使IO工作线程忙,直到数据完全发送?如果是这样,增加WORKER_SIZE会帮助我防止延迟吗?
一般来说,增加WORKER_SIZE> = cpu * 2的数量无济于事,因为, NIO是非阻塞的,如果我没有弄错,它的CPU密集型。对于CPU密集型任务CPU * 2主要选择线程数。
<强>更新强>
NioWorker运行一个带有selector.select(500ms)的循环来接收OP_READ,selector.select带有超时阻塞调用,如果大多数连接都很慢,性能可能会降低?您可以减少org.jboss.netty.channel.socket.nio.SelectorUtil.java中的超时并进行测试。
答案 1 :(得分:0)
您在CODE-1中添加的线程池[s]用于boss线程和工作线程。 boss线程接受连接并将其传递给工作线程进行处理。
您在CODE-2中添加的执行程序用于处理工作线程读取的消息。
慢速连接不会影响性能,因为您使用的是非阻塞架构(NIO) - 在Netty中设置为不阻止(如果需要,可以)