最多请求后,我可以重新启动Puma worker吗?

sed*_*ddy 6 garbage-collection ruby-on-rails passenger heroku puma

Phusion Passenger提供了在N个请求处理内存问题后重新启动工作进程的功能,我想知道Puma是否有类似的设置吗?我在文档或代码中找不到任何合适的东西,但是我没有使用Puma太多,因此可能会丢失一些东西。

乘客功能的文档在这里

PassengerMaxRequests

应用程序进程将处理的最大请求数。处理完这么多请求后,应用程序进程将关闭,Phusion Passenger将重新启动它。值0表示没有最大值:应用程序进程将在达到其空闲超时时关闭。

如果您的应用程序正在泄漏内存,则此选项很有用。通过在一定数量的请求后将其关闭,可以确保操作系统释放其所有内存。

我目前在Heroku上遇到问题,大约12到14个小时后,我们达到了Rails应用程序的内存配额限制,这完全是因为GC导致内存使用量急剧增加。我还将尝试调整我们的GC设置,但过去我发现此功能在生产环境中非常有用,因此如果可用,仍希望对其进行设置。

Cap*_*pot 1

你绝对可以做到!不确定你是否应该这样做。是否还有其他可以依赖的指标,例如内存使用情况?

但要回答您的问题,您可以创建一个 Rack 类,将其放在应用程序之前。在该机架应用程序中,传递您收到的所有相同变量,并向计数器加 1。

然后,当计数器达到所需的数字时,执行puma 热重启。您可能希望在处理当前请求后计划热重启。

您也可以只有一个定期的 Rake 任务,只需检查计数器和热重启 puma。