ruby-on-rails - 如何限制 ruby​​ 对 Passenger/NGINX 的 CPU 使用?

标签 ruby-on-rails ruby linux nginx passenger

我在 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/

相关文章:

ruby-on-rails - 如何强制采用表格形式的方法?

ruby - Controller 无法检测到 ajax 请求

linux - 使用 usbserial 通过 RxTx 写入数据?

linux - ssh 返回拒绝访问后调用 mysql 的 Bash 脚本

ruby-on-rails - 如何在 ruby​​ on Rails 中实现显示所有评论功能?

ruby-on-rails - 如何检查一个对象是has_one还是has_many的结果?

ruby-on-rails - Rails/pg group_by 两条记录之间的平均值

ruby-on-rails - 按父 ID 对记录进行分组

javascript - 从第三方网站的 script/include 标签配置 Javascript 的最佳方法是什么?

linux - 如何使用v4l2读取视频文件