缓慢连接会影响网络性能吗?

时间:2012-01-09 14:52:23

标签: java performance netty

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会帮助我防止延迟吗?

2 个答案:

答案 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中设置为不阻止(如果需要,可以)