【问题标题】:Concurrency problems in netty applicationnetty 应用中的并发问题
【发布时间】:2025-11-25 03:05:01
【问题描述】:

我实现了一个简单的http服务器link,但是测试的结果(ab -n 10000 -c 100 http://localhost:8080/status)很糟糕(查看上一个链接中的test.png) 我不明白为什么它不能与多个线程一起正常工作。

【问题讨论】:

    标签: concurrency netty


    【解决方案1】:

    我相信,默认情况下,Netty 的默认线程池配置的线程数与机器上的内核数一样多。这个想法是异步和非阻塞地处理请求(在可能的情况下)。

    您的/status 测试包括一个数据库事务,由于数据库驱动程序的内在设计等原因,该事务会阻塞。因此,您的高水平表现本质上是:-

    a.) 您正在对 10,000 个请求进行大量测试,尝试并行运行 100 个请求 b.) 您正在为每个请求调用数据库,所以这不会很快(相对而言,与某些非阻塞 I/O 操作相比)

    给您的几个问题/注意事项:-

    1. 机器规格?
      规格是什么。您正在运行应用程序并进行测试的机器?
      多少个核心?
      如果您只有 8 个内核可用,那么您将只有 8 个线程在任何时候并行运行。这意味着每次 100 个请求的批次将排队

    2. 考虑测试期间机器上运行的内容
      听起来您正在同一台机器上运行应用程序和 Apache Bench,因此请注意,您的应用程序和测试工具都将竞争这些核心(这是除了任何后台进程也在竞争这些核心之外 -比如操作系统)

    3. 负载是多少?
      预测负载很困难。如果您确实认为您在任何时候都可能有 100 个请求进入数据库,那么您可能需要考虑:-
      一个。您的生产环境可能需要几个实例来处理负载
      湾。尝试更改配置。 Netty的默认线程池增加线程数
      C。考虑一下您的应用程序架构 - 您是否可以缓存这些结果中的任何一个,而不是为每个请求访问数据库

    【讨论】:

    • 有 2 个内核,可以并行处理 4 个线程。我认为主要的问题确实不是像 Frederic 之前写的那样异步数据库调用。
    • 因此您有 1 个具有 2 个内核的超线程 CPU。那么你的负载测试对于这台机器来说太大了。使数据库调用异步而不是同步不会改善您的情况 - 它可能会使情况变得更糟。仅仅通过异步阻塞调用并不能提高效率。我认为您只需要更好地处理高级别发生的事情即可为您的测试请求 1 提供服务,了解异步、阻塞、非阻塞、Netty 架构等。
    • 你的答案,我会尽力做到最好的!
    • 不客气。至少为您正在尝试测试应用程序的性能感到自豪——这是一项所有开发人员都没有考虑到其生命周期的任务(至少根据我的经验)。
    【解决方案2】:

    可能与您的一个处理程序中的数据库访问(同步任务)的使用有关(至少在您的 TrafficShappingHandler 中)?

    您可能需要“异步”您的数据库调用(例如以生产者/消费者方式的其他线程)...

    如果是别的,我没有足够的信息......

    【讨论】: