延迟处理更多 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
那样设置限制。
我有一个使用赛璐珞的 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
那样设置限制。