【发布时间】:2025-11-25 03:05:01
【问题描述】:
我实现了一个简单的http服务器link,但是测试的结果(ab -n 10000 -c 100 http://localhost:8080/status)很糟糕(查看上一个链接中的test.png)
我不明白为什么它不能与多个线程一起正常工作。
【问题讨论】:
标签: concurrency netty
我实现了一个简单的http服务器link,但是测试的结果(ab -n 10000 -c 100 http://localhost:8080/status)很糟糕(查看上一个链接中的test.png)
我不明白为什么它不能与多个线程一起正常工作。
【问题讨论】:
标签: concurrency netty
我相信,默认情况下,Netty 的默认线程池配置的线程数与机器上的内核数一样多。这个想法是异步和非阻塞地处理请求(在可能的情况下)。
您的/status 测试包括一个数据库事务,由于数据库驱动程序的内在设计等原因,该事务会阻塞。因此,您的高水平表现本质上是:-
a.) 您正在对 10,000 个请求进行大量测试,尝试并行运行 100 个请求 b.) 您正在为每个请求调用数据库,所以这不会很快(相对而言,与某些非阻塞 I/O 操作相比)
给您的几个问题/注意事项:-
机器规格?
规格是什么。您正在运行应用程序并进行测试的机器?
多少个核心?
如果您只有 8 个内核可用,那么您将只有 8 个线程在任何时候并行运行。这意味着每次 100 个请求的批次将排队
考虑测试期间机器上运行的内容
听起来您正在同一台机器上运行应用程序和 Apache Bench,因此请注意,您的应用程序和测试工具都将竞争这些核心(这是除了任何后台进程也在竞争这些核心之外 -比如操作系统)
负载是多少?
预测负载很困难。如果您确实认为您在任何时候都可能有 100 个请求进入数据库,那么您可能需要考虑:-
一个。您的生产环境可能需要几个实例来处理负载
湾。尝试更改配置。 Netty的默认线程池增加线程数
C。考虑一下您的应用程序架构 - 您是否可以缓存这些结果中的任何一个,而不是为每个请求访问数据库
【讨论】:
可能与您的一个处理程序中的数据库访问(同步任务)的使用有关(至少在您的 TrafficShappingHandler 中)?
您可能需要“异步”您的数据库调用(例如以生产者/消费者方式的其他线程)...
如果是别的,我没有足够的信息......
【讨论】: