如何在netty中动态管理CPU负载?

时间:2015-07-30 19:50:09

标签: java multithreading netty

afaik,EventLoops由Executors支持," children / workers"由EventLoops支持,"父母/老板​​"管理孩子/工人的激活"在一个频道上。

  1. 是否有阻止队列来保存传入请求,直到有孩子可以处理它们为止?

  2. 孩子会创建多少个主题?

  3. 如果在支持子线程池的队列已满的情况下,如何确保拒绝父进程的传入通道事件?

  4. 很难辨别netty的底层线程池的配置位置和方式。

    如果有人可以提供1& 2。

1 个答案:

答案 0 :(得分:0)

  1. 是的,NioEventLoopGroup扩展MultithreadEventExecutorGroup,将EventExecutor[] children创建为new SingleThreadEventExecutor[nThreads]。此TaskQueue的{​​{1}}为SingleThreadEventExecutor

    http://netty.io/4.0/api/io/netty/util/concurrent/SingleThreadEventExecutor.html

  2. NioEventLoopGroup()的标准构造函数创建了默认的事件循环线程数量:

    LinkedBlockingQueue<Runnable>()

    您可以将DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt( "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2)); 作为JVM启动参数传递。

    您还可以在NioEventLoopGroup()的构造函数中输入线程数。我们使用它作为例子:

    io.netty.eventLoopThreads
    private final static int BOSS_THREADS = 1;
    private final static int MAX_WORKER_THREADS = 12;
    
    EventLoopGroup bossGroup = new NioEventLoopGroup(BOSS_THREADS);
    EventLoopGroup workerGroup = new NioEventLoopGroup(calculateThreadCount());
    
  3. 我实际上不知道Netty是否有内置功能。 AFAIK队列只需要private int calculateThreadCount() { int threadCount; if ((threadCount = SystemPropertyUtil.getInt("io.netty.eventLoopThreads", 0)) > 0) { return threadCount; } else { threadCount = Runtime.getRuntime().availableProcessors() * 2; return threadCount > MAX_WORKER_THREADS ? MAX_WORKER_THREADS : threadCount; } } 个线程。