【问题标题】:Netty threads being blockedNetty 线程被阻塞
【发布时间】:2012-01-25 16:29:40
【问题描述】:

我的系统中有 3 个 ThreadPoolExecutor。

一个用于 Netty 的 Master 进程,另一个用于 Netty 的工作进程,最后一个用于处理 ad-hoc 处理(向邮件服务器发送请求)。

ExecutorService bossExecutors = Executors.newFixedThreadPool(1, 
                 new ServerThreadFactory("netty-boss")); 
ExecutorService workerExecutors = Executors.newFixedThreadPool(10, 
                 new ServerThreadFactory("netty-worker"));
ChannelFactory factory = new NioServerSocketChannelFactory(
                 bossExecutors, 
                 workerExecutors,
                 Runtime.getRuntime().availableProcessors());

ExecutorService mailExecutor = Executors.newFixedThreadPool(40);

mailExecutor 开始向邮件服务器发出请求之前,这一切正常。直到,使用mailExecutor 的批量请求,通常向邮件服务器发出 5000+ 个请求完成,netty 线程被阻塞。

我不明白为什么那个时候 netty 线程似乎被阻塞了,因为我已经分配了明确的线程池。在那段时间里,Netty 甚至无法处理单个请求。

知道为什么会发生这种情况或我做错了什么吗?

【问题讨论】:

    标签: java netty


    【解决方案1】:

    你能提供一个线程转储吗?

    jstack <pid>
    

    你也不应该为worker / poss线程池使用一个固定的线程池。使用缓存的,这样你就可以确保你永远不会陷入饥饿。您应该在构造函数中使用 3 参数指定工作人员计数。

    【讨论】:

    • 我使用 workers count = Runtime.getRuntime().availableProcessors() 将固定线程池更改为缓存线程池,但它似乎仍在发生。这是线程转储:dl.dropbox.com/u/360993/jstack.txt 谢谢。
    • 问题是发送到邮件服务器是一个阻塞操作。因此,您应该在执行发送的处理程序前面添加一个 ExecutionHandler。否则会阻塞 netty 的 IO-Thread(s)。
    【解决方案2】:

    这听起来像是日程安排问题。您有 40 个线程处于重负载状态,而 availableProcessors 线程数用于处理 Netty 工作(您创建工厂时的 availableProcessors() 计数是多少?)。

    因此,与处理邮件工作的 40 个线程相比,Netty 线程可能太少并且被饿死,因为它们从未被选中执行。

    也可能是由于某种原因,您的工作线程在邮件线程完成时被阻塞,可能是由于一些正在同步的共享对象(是否有一些队列或邮件列表要发送到 netty 线程需要写入,以及发送时锁定了哪些邮件线程?)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多