延迟处理更多请求/秒

时间:2016-04-06 11:54:51

标签: multithreading jruby celluloid

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

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

对于每个收到的请求,我正在处理内部延迟块。

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)

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

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

1 个答案:

答案 0 :(得分:2)

使用游泳池。

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

您需要对您的资源要求保持现实!你知道每个请求你需要多少钱吗?你需要根据它来规划你的演员策略。

不要使用太多或太少的演员。现在,您怀疑使用的线程过多,因为如果使用defer {} async,那么@*<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">*@ <link rel="stylesheet" href="~/Content/jquery-ui/jquery-ui.theme.widgets.css"> 就不会设置限制,如果与实际大小的池一起使用的话。