3

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

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

对于每个收到的请求,我都在 defer 块内处理它。

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

对于 20 个请求/秒,它可以正常工作,没有任何延迟。该服务器具有 15Gb RAM 和 4 个内核的配置。它还连接到 Postgres DB 和 Redis DB。但这似乎不是问题。

这是我的基本结构,有主要参与者服务,

supervisor = Service.supervise

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

@pushsocket_actor = PushSock.pool(size: 10)

上面 defer 块中的 send_response 方法调用 pushsocket actor。在延迟块 ResponseHandler 不是一个演员。

因此,对于 Service Actor,我没有使用池。

4

1 回答 1

2

使用游泳池。

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

但是,您需要对资源需求保持现实!您知道每个请求需要多少吗?您需要基于此计划您的演员策略。

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

于 2016-04-07T16:42:23.263 回答