【问题标题】:How do I limit ruby's CPU usage for Passenger/NGINX?如何限制乘客/NGINX 的 ruby​​ 的 CPU 使用率?
【发布时间】:2018-08-21 03:47:11
【问题描述】:

我正在为我的 Ruby on Rails 应用程序在 Nginx 上运行 Passenger。

我的应用偶尔会运行一些非常密集的进程,这些进程会以 100% 的速度最大化 ruby​​ 进程的 CPU 输出,同时一次处理最多 30 秒。

我希望能够限制我的 ruby​​ 进程可以访问的可用 CPU。

Passenger 和 NGINX 设置良好,我只需要限制我的乘客/ruby 进程可以访问的可用 CPU。

如果我可以将其设置为每个进程的 80%,那么我的密集进程将需要更长的时间来处理(最高为 80%),但我的总 CPU 不会在 100% 时达到最高,剩下的 CPU 用于其他要访问的进程。

是否有可以执行此操作的 Linux 配置/应用程序?

【问题讨论】:

  • 为什么不确定究竟是什么消耗了这么多 CPU?也许这是一个不应在请求期间运行的 CPU 密集型任务?最好的方法是在您的 CPU 使用率达到峰值时查看日志并确定最后一个请求/操作是什么只需单击站点直到您遇到该异常
  • 我知道什么在使用 CPU,这是导出/处理大量数据时的 ruby​​ 进程。请求必须运行并且需要很长时间来处理(每天最多只运行几次),我只想让它运行,但只允许它使用 80% 的可用 CPU。
  • 你知道 google.com 是什么吗?只是第一个搜索结果blog.scoutapp.com/articles/2014/11/04/…

标签: ruby-on-rails ruby linux nginx passenger


【解决方案1】:

将我的后续评论变成答案。您可能可以使用 Alexander 提供的链接来限制 CPU。

但是,这是一种糟糕的架构方法。在 Rails 领域,CPU 密集型和长时间运行的任务通常在后台作业中完成。此类任务的示例包括导出/处理大量数据、发送电子邮件、进行由用户操作触发的第三方 API 调用。

所以,我建议你建立一个后台作业系统。例如,您可以使用 Sidekiq。启动“导出/处理大量数据”的请求只是将由工作进程拾取并完成的作业排入队列。这样,您可以独立于 Nginx/Passenger 设置扩展该工作进程(或其中一组)。如果您需要为该进程提供更多或更少的 CPU,则与您的 Web 层无关。记忆也是如此。

如果您将此数据提供给浏览器或其他任何东西,您也可以选择。您可以将此文件存储在 S3 上并返回指向它的链接。您可以将其本地存储在 nginx 可访问的路径中,并允许 nginx 通过再次提供链接将其作为任何其他文件提供服务。如果生成响应需要 30 秒,您可以通过电子邮件将该链接发送给用户连接一个短暂的 websocket 并将链接推送到它上面的数据。

我希望您可以考虑将此方法作为限制 Web 进程的 CPU 使用率的替代方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2017-01-25
    相关资源
    最近更新 更多