我在Nginx上运行Passenger,用于我的Ruby on Rails应用程序。
我的应用程序偶尔运行一些非常密集的进程,最大程度上ruby将CPU处理为100%,同时处理最多30秒。
我希望能够限制我的ruby进程可以访问的可用CPU。
Passenger和NGINX设置正常,我只需要限制我的乘客/红宝石流程可以访问的可用CPU。
如果我可以将此设置为每个进程80%,那么我的密集过程将花费更长的时间来处理(最大值为80%),但我的总CPU不会达到最大值100%,而CPU其他访问过程。
是否有可以执行此操作的Linux配置/应用程序?
答案 0 :(得分:0)
将我的后续评论转化为答案。您可以使用Alexander提供的链接来限制CPU。
然而,这是一种糟糕的架构方法。在Rails中,CPU密集型和长时间运行的任务通常在后台作业中完成。此类任务的示例包括导出/处理数据量,发送电子邮件,由用户操作触发第三方API调用。
所以,我建议你建立一个后台工作系统。例如,您可以使用Sidekiq。启动“导出/处理大量数据”的请求只是将一个由工作进程拾取并完成的作业排入队列。这样,您可以将该工作进程(或其中一组)与Nginx / Passenger设置分开进行扩展。如果您需要为该过程提供更多CPU或更少的CPU与您的Web层无关。内存也一样。
如果您将此数据提供给浏览器或其他任何内容,您也可以选择。您可以将此文件存储在S3上并返回指向它的链接。您可以将其本地存储在nginx可访问的路径中,并允许nginx通过再次提供链接将其作为任何其他文件提供。如果生成响应需要30秒,您可以通过电子邮件将该链接发送给用户或连接短暂的websocket并将链接推送到其上的数据。
我希望您可以将此方法视为限制Web进程的CPU使用率的替代方法。