【问题标题】:Ktor, Netty and increasing the number of threads per endpointKtor、Netty 和增加每个端点的线程数
【发布时间】:2022-02-17 04:57:01
【问题描述】:

使用 Ktor 和 Kotlin 1.5 实现由 Netty 支持的 REST 服务。关于这项服务的几点说明:

  1. “工作”需要很长时间才能完成。
  2. 一个唯一的客户端端点并行向该服务发送多个请求。
  3. 只有少数几个独特的客户端端点。

服务未按预期扩展。我们对来自单个客户端的并行请求进行了负载测试,我们注意到服务器上只有两个线程实际处理请求。这不是资源匮乏的问题 - 有大量的网络、内存、CPU 等,我们并行启动多少请求并不重要 - 总是有两个线程保持忙碌,而其他线程则处于空闲状态。

我们是否可以配置一个参数来增加可用于处理特定端点请求的线程数?

【问题讨论】:

  • 您正在连接到数据库吗?如果是这样的话,也许你应该创建一个连接池。
  • 不,这是 CPU 工作。

标签: multithreading kotlin netty ktor


【解决方案1】:

Netty 使用所谓的非阻塞 IO 模型 (http://tutorials.jenkov.com/java-concurrency/single-threaded-concurrency.html)。

在这种情况下,你只有一个线程,它可以并行处理很多子进程,只要你遵循最佳实践(不阻塞主线程事件循环)。

【讨论】:

  • 以下是我们所看到的 - 当我们在不同端点中拥有客户端时,系统可以更好地扩展。例如,让两个不同的端点从 10 个线程发送请求比让一个端点从 20 个线程发送请求更好。不,调用方没有资源限制。这让我认为这个问题与来自同一端点的请求被分配给有限数量的线程有关,而不管有多少线程是空闲的。
【解决方案2】:

您可能需要检查 Netty https://ktor.io/docs/engines.html#configure-engine 的以下配置选项

connectionGroupSize = x
workerGroupSize = y
callGroupSize = z

默认值通常设置得相当低,调整它们可能对耗时的“工作”很有用。确切的值可能会因可用资源而异。

【讨论】:

  • 我们尝试了所有这些,它们似乎没有什么不同。我们仍然只看到两个线程处理事件,不管有多少是空闲的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2020-09-02
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多