netty应用程序中的并发问题

时间:2015-08-02 16:55:48

标签: concurrency netty

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

2 个答案:

答案 0 :(得分:2)

我认为,默认情况下,Netty的默认线程池配置的线程数与计算机上的核心数一样多。想法是异步处理请求和非阻塞(如果可能)。

您的/status测试包含一个数据库事务,由于数据库驱动程序的固有设计而阻塞。所以您的性能 - 在高级别 - 基本上是由于: -

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

有几个问题/注意事项: -

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

  2. 考虑测试期间计算机上正在运行的内容
    这听起来就像是在同一台机器上运行应用程序和Apache Bench,所以请注意,您的应用程序和测试工具都将争夺这些核心(这是除了正在争夺这些核心的任何后台进程之外 - 例如OS)

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

答案 1 :(得分:0)

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

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

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