代码1
new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(),WORKER_SIZE)
代码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 会帮助我防止延迟吗?
最佳答案
慢速连接通常不会影响 NIO 中的 Netty 线程(查看更新说明)。
关于Netty服务器内部线程的一些要点
默认情况下,每个服务器端口只有一个 Boss 线程,并且它 将接受连接并将连接移交给工作人员 线程。
准确的说:WORKER_SIZE是NioWorker的最大数量 服务器可以拥有的可运行程序。例如如果服务器有 只有1个连接,那么就会有1个工作线程。如果连接数量不断增加并且无法分配给下一个工作线程( Activity 连接 > WORKER_SIZE),则连接将以循环方式分配给工作线程。
If IO worker thread pool size (default is 2*count of cpu) can be set from CODE-1, what is the purpose of adding executer (a thread pool) to pipeline in CODE-2 ?
如果您的上游任务阻塞,那么您应该使用执行处理程序在单独的线程池中执行它们。否则 Nio 读/写将无法按时工作(延迟?)。我认为拥有一个执行处理程序将有助于减少延迟,而不是为 WORKER_SIZE 设置较大的值。
IO operations are done from worker threads. Does that mean, a client with slow connection or bad network keeps IO worker thread busy until data is completely sent ? If so, increasing WORKER_SIZE would help me prevent latencies ?
一般来说,增加 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 中的超时并进行测试。
关于java - 连接速度慢会影响netty性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8790253/