我在 Nginx 上为我的 Ruby on Rails 应用程序运行 Passenger。
我的应用偶尔会运行一些非常密集的进程,使 ruby 进程的 CPU 占用率达到 100%,同时一次处理长达 30 秒。
我希望能够限制我的 ruby 进程可以访问的可用 CPU。
Passenger 和 NGINX 设置良好,我只需要限制我的 passenger/ruby 进程可以访问的可用 CPU。
如果我可以将此设置为每个进程的 80%,那么我的密集进程将花费更长的时间来处理(达到 80%),但我的总 CPU 不会达到 100%,留下 CPU其他进程访问。
是否有可以执行此操作的 Linux 配置/应用程序?
最佳答案
将我的后续评论变成答案。您或许可以使用 Alexander 提供的链接来限制 CPU。
但是,这是一种糟糕的架构方法。在 Rails 领域,CPU 密集型和长时间运行的任务通常在后台作业中完成。此类任务的示例包括导出/处理大量数据、发送电子邮件、进行由用户操作触发的第三方 API 调用。
因此,我建议您设置一个后台作业系统。例如,您可以使用 Sidekiq。启动“导出/处理大量数据”的请求只是将工作进程拾取并完成的工作排入队列。这样,您可以从 Nginx/Passenger 设置中单独扩展该工作进程(或一组)。如果您需要为该进程提供更多或更少的 CPU,则与您的 Web 层无关。内存也是如此。
如果您将这些数据提供给浏览器或其他任何东西,您也有选择。您可以将此文件存储在 S3 上并返回指向它的链接。您可以将其本地存储在 nginx 可访问的路径中,并允许 nginx 通过再次提供链接将其作为任何其他文件提供服务。如果生成响应需要 30 秒,您可以通过电子邮件将链接发送给用户,或连接一个短暂的 websocket 并将链接推送到其上的数据。
我希望您可以考虑将此方法作为限制网络进程 CPU 使用率的替代方法。
关于ruby-on-rails - 如何限制 ruby 对 Passenger/NGINX 的 CPU 使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49246828/