我能够使用以下命令限制 python 进程仅使用 50% CPU
cpulimit -l 50 -e python
但是当我尝试对 Node 执行相同操作时,它根本无法检测到该进程。有人知道吗?在 中ps aux
,我可以看到node
,所以我不确定缺少什么
cpulimit -l 50 -e node
我运行的平台是 Ubuntu 14.04,但我想这个问题应该与 Linux 风格无关。
我目前的工作是
cpulimit -l 50 -p $(pidof node)
但是,这意味着它不会检测到节点进程的任何新实例。
答案1
cpulimit
众所周知,在某些情况下效果不佳。有时它工作得很好(在简单的单线程应用程序上),而其他时候(主要是多线程或多进程)它不起作用。
从技术上讲,有两个问题可能导致 cpulimit 不限制。首先,您尝试运行的程序会以这样的方式生成一个线程或进程,即生成的线程不是生成线程的子级。这样做有多种原因,但有点不常见。
其次,SIGSTOP 不是一个可以“处理”的信号。但信号是异步的。所以线程a可以派生线程b。当线程 b 启动时,可以对线程 a 发出 SIGSTOP 信号,而线程 b 在没有该信号的情况下启动。
SIGSTOP 还会“在可能的情况下”暂停进程。有时,特别是对于磁盘 io,线程将无法暂停。我能想到的最常见的是磁盘 IO。
换句话说,虽然 SIGSTOP(cpulimit 使用的内容)应该停止一个线程和所有其他子线程,但它并不总是按照您在可以启动其他进程的复杂多线程应用程序中期望的方式执行。在这些情况下,使用传统的调度限制会为您提供更好的服务(很好)。
答案2
根据@Mark Plotnick的评论,我终于弄清楚了原因
ls -l "/proc/$(pidof node)/exe"
回报
lrwxrwxrwx 1 antony antony 0 Aug 27 13:04 /proc/4414/exe -> /usr/bin/nodejs
所以node
我应该使用nodejs
以下命令有效
cpulimit -l 50 -e nodejs
更新:这实际上不是一个万无一失的解决方案。是的,cpulimit
可以检测nodejs
进程,但如果您正在运行持久nodejs
脚本,cpulimit
可能会导致脚本过早nodejs
终止且没有任何警告
Update2:控制台/终端上会显示nodejs进程已停止,但实际上,nodejs仍在后台运行。