当前位置: 首页 > 知识库问答 >
问题:

Netty服务器老板和工人线程池大小

闻人哲茂
2023-03-14

如果我对Netty server的理解是正确的,那么主boss事件循环线程池(默认大小为2*AvailableProcessor)接受客户端连接,然后将请求处理工作卸载到工作线程。

现在,我的问题是,工作线程的线程池大小应该是多少?如果工作线程正在执行一些阻塞操作,例如等待网络调用响应,那么工作线程池是否应该足够大(例如200个线程)来处理并发客户端请求,因为每个工作线程都被阻塞以服务客户端请求?我看到大多数ServerBootstrap示例都显示工作线程池大小为2x可用性处理器,与主线程池大小相同。不会将并发客户端请求处理的数量限制为2x可用性处理器吗?

更让我困惑的是,我看到另一个线程池被称为处理程序线程池(EventExecutorGroup),并说这个线程池处理请求处理。那么工作线程池有什么用呢?

这三种类型的线程池在下面的示例中创建。

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(10);
EventExecutorGroup handlerThread = new DefaultEventExecutorGroup(20);

若工作线程正在执行一些CPU密集型进程(与上例中等待网络调用响应相反),则工作线程将与主boss线程竞争。这种情况会不会使boss线程变慢,从而导致排队等待接受或拒绝的客户端连接?在这种情况下,我相信服务器的性能将与传统的阻塞服务器相同。你能谈谈你的想法吗?

共有1个答案

宣滨海
2023-03-14

现在,我的问题是,工作线程的线程池大小应该是多少?如果工作人员正在执行某些阻塞操作,例如等待网络呼叫响应

您不应该阻塞网络工作线程,尤其是对于网络I/O--这是使用非阻塞异步框架(如netty)的全部要点。也就是说,为了与像JDBC这样的同步/阻塞代码进行互操作,netty提供了一种使用EventExecutorGroup将此类执行卸载到单独线程池的方法。看看Netty文档中的这个片段:

 // Tell the pipeline to run MyBusinessLogicHandler's event handler methods
 // in a different thread than an I/O thread so that the I/O thread is not blocked by
 // a time-consuming task.
 // If your business logic is fully asynchronous or finished very quickly, you don't
 // need to specify a group.
 pipeline.addLast(group, "handler", new MyBusinessLogicHandler());

如果工作线程正在执行一些CPU密集型进程

这是一个更一般的问题,与netty并不完全相关,但如果您的工作负载是CPU密集型的,那么使用异步网络I/O框架可能不适合您。

 类似资料:
  • 这更像是一个服务人员的问题,尽管它可能更具体地针对Sapper。我真的不知道,因为我是第一个和服务人员打交道的人,我几乎没有使用过他们,而且经常觉得他们是个麻烦。 基本上,无论我做什么,我都无法让localhost:3000停止加载应用程序的旧副本。我以各种方式取消了服务工作人员的注册,包括尝试以编程方式取消注册。我清除了缓存,甚至清除了浏览器中的所有浏览数据。我的Sapper开发环境中的服务器未

  • 我正在尝试使用线程池开发一个java聊天服务器,但我不知道如何处理来自客户端的传入消息。我想将每个套接字连接保存在哈希图中,并将任务添加到线程池的队列中。但是,服务器如何知道何时从客户端接收消息而不实例化缓冲区读取器?

  • 主要内容:1 内置线程池,1.1 newFixedThreadPool,1.2 newCachedThreadPool,1.3 newScheduledThreadPool,1.4 newSignalThreadExecutor,2 默认线程工厂,3 Runnable转换为Callable,4 总结详细介绍了Executors线程池工具类的使用,以及四大内置线程池。 Executors可以看作一个工具类,里面提供了好多静态方法,这些方法根据用户选择返回不同的内置线程池实例,或者返回线程工厂,或者

  • 问题内容: 您能解释一下Netty如何使用线程池工作吗?我是否正确理解,线程池有两种:老板线程和工人线程。老板用于执行I / O,而worker用于调用用户回调(messageReceived)来处理数据? 问题答案: 这是来自NioServerSocketChannelFactory文档 一个ServerSocketChannelFactory,它创建一个基于NIO的服务器端ServerSock

  • 我们在Java小程序中使用Netty与tomcat服务器通信。这很好用。 我可以使用下面发布的helper类获取代理信息。 我的问题是如何向Netty提供代理服务器信息? 更多信息: 我们有一个用户在Internet Explorer中配置了代理服务器。网页和Java小程序被提供,但是当Netty试图连接时,它绕过代理服务器并进行直接连接;这失败了,因为用户设置了防火墙来防止直接连接——所有客户端

  • Netty服务器,Fedora。我只是无法从远程主机连接到服务器,并且通过util没有显示监听套接字。但是我可以在同一台机器上建立运行客户端和服务器的连接。就像这样: 我已尝试仅使用端口、localhost IP、0.0.0.0 IP和网络IP初始化