延迟处理更多 requests/sec

Delay in processing more requests/sec

我有一个使用赛璐珞的 JRuby 应用程序。它通过 Zeromq 套接字接收请求并以 JSON 字符串响应。

因此,我的应用程序中有 2 个参与者,一个用于处理请求,另一个用于发送响应(Zeromq 中的推送套接字)。 应用程序以大约 30 requests/second 的速率接收请求,将来会更多,比如 1000/秒。但是随着每秒请求数量的增加,需要更多的时间来处理。它开始使用更多 CPU.

对于每个收到的请求,我都在延迟块中处理它。

defer {
  response = ResponseHandler.new(socket,message).start
  send_response(response)
}

对于 20 requests/sec,它可以正常工作,没有任何延迟。服务器配置为 15Gb RAM 和 4 核。 它还连接到 Postgres DB 和 Redis DB。但这在这里似乎不是问题。

这是我的基本结构, 有主要演员服务,

supervisor = Service.supervise

这会在内部创建具有 10 个池的 PushSock Actor 实例。

@pushsocket_actor = PushSock.pool(size: 10)

send_response 上面 defer 块中的方法调用 pushsocket actor。在 defer 块中,ResponseHandler 不是 Actor。

所以对于 Service Actor,我没有使用池。

使用游泳池。

现在您正在使用内部线程池...不断产生新线程。相反,创建一个演员池,然后使用 async 调用...这实际上会立即减少任务数量 运行。这会加快响应时间,因为它会全速处理,而不仅仅是接受请求。

不过,您需要现实地看待您的资源需求!您知道每个请求需要多少吗?你需要根据这个来规划你的演员策略。

演员不要太多或太少。现在,我怀疑您使用了太多线程,因为如果与实际大小的池一起使用,使用 defer {} 不会像 async 那样设置限制。