java - 连接速度慢会影响netty性能吗?

标签 java performance netty

代码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/

相关文章:

java - 在 spring-data-jpa 中通过 boolean 属性查询而不使用方法参数

performance - Flask Admin-性能困难

java - 管道中的条件执行处理程序

MySQL 查询获取最近 12 个月的销售额,其中月份和年份是不同的字段

jquery - 此 jQuery/HTML 代码中的性能/可访问性问题?

java - 无法在 Java 7 上启用 SNI

java - Netty 工作线程和吞吐量

Javadoc:参数和返回需要明确的类型描述

java - 几张照片后相机 Intent 使我的应用程序崩溃

oauth2 的 java Rest jersey 重定向不起作用