我实现了一个简单的http服务器link,但测试结果(ab -n 10000 -c 100 http://localhost:8080/status
)非常糟糕(请查看上一个链接中的test.png)
我不明白为什么它不适用于多个线程。
答案 0 :(得分:2)
我认为,默认情况下,Netty的默认线程池配置的线程数与计算机上的核心数一样多。想法是异步处理请求和非阻塞(如果可能)。
您的/status
测试包含一个数据库事务,由于数据库驱动程序的固有设计而阻塞。所以您的性能 - 在高级别 - 基本上是由于: -
a。)您正在对10,000个尝试并行运行100个请求的请求进行相当大的测试 b。)您正在为每个请求调用数据库,因此这不会很快(相对于某些非阻塞I / O操作而言相对而言)
有几个问题/注意事项: -
机器规格?
什么是规格。您正在运行应用程序并进行测试的机器?
多少个核心?
如果您只有8个可用核心,那么您将只有8个并行运行的线程。这意味着每次100个请求的批次将排队等候
考虑测试期间计算机上正在运行的内容
这听起来就像是在同一台机器上运行应用程序和Apache Bench,所以请注意,您的应用程序和测试工具都将争夺这些核心(这是除了正在争夺这些核心的任何后台进程之外 - 例如OS)
负载是什么?
预测负载是很困难的。如果您确实认为您可能在任何时候有100个请求进入数据库,那么您可能需要考虑: -
一个。您的生产环境可能需要几个实例来处理负载
湾尝试更改配置。 Netty的默认线程池增加线程数
C。考虑一下你的应用程序架构 - 你可以缓存这些结果而不是为每个请求转到数据库吗
答案 1 :(得分:0)
可能与您的一个处理程序中的数据库访问(同步任务)的使用相关联(至少在您的TrafficShappingHandler中)?
您可能需要“异步”数据库调用(例如,生产者/消费者方式中的其他线程)......
如果还有别的,我没有足够的信息......