仅减慢一个过程来调节CPU温度


9
  1. 我有一个程序。当它运行时,CPU温度从50摄氏度升高到80摄氏度,这是我主要关心的问题。

    我可以控制CPU频率来降低​​它的速度,但是我也不想降低其他进程的速度。

    是否有可能在不影响其他进程的情况下减慢特定进程的速度以保持CPU凉爽?

    我的操作系统是Ubuntu 10.10。

  2. 我尝试通过设置进程的优先级,但nice -n 15 myprogram不确定是否可以使用。CPU高77摄氏度。

    是否nice仅设置其他进程的相对优先级?即,如果其他进程未在运行,该运行良好的进程会快速运行吗?我想将整个过程设置为缓慢运行。


1
此过程的作用是:大量的输入/输出?主CPU上的计算繁重?在GPU(视频卡)上进行大量计算(通常但不限于计算图像的程序)?
吉尔(Gilles)'所以

程序为pdf2djvu,将pdf文件转换为djvu。是沉重的IO还是沉重的CPU还是沉重的GPU?在不同情况下,您有不同的方式吗?
蒂姆(Tim)

4
80º非常非常高。我生活在西班牙的高温地区,处理器的最高温度约为60º。打开计算机,清洁所有零件并更换散热器。我认为您不是使用CPU。
Rufo El Magufo 2011年

尝试同时做。
2011年

80°实际上很高,但根据CPU型号不算极端。最高支持90°C的CPU,无问题
-Kiwy

Answers:


16

CPULimit正是您所需要的。您启动程序,然后对程序名称或PID运行cpulimit,并指定要限制的百分比。

以下命令将PID 7777的进程限制为5%的CPU使用率。

cpulimit -p 7777 -l 5

或者,您可以使用可执行文件的名称:

cpulimit -e myprogram -l 5

或可执行文件的绝对路径:

cpulimit -P /path/to/myprogram -l 5

请注意,该百分比是所有核心的百分比;因此,如果您有4个核心,则可以使用400%。


1
谢谢!(1)CPULimit仅用于已经运行的进程吗?提交要运行的程序时不使用?(2)它是否固定了某个进程的CPU使用率百分比,或者设置了该进程的上限,并允许其使用率根据其他进程在0和该上限之间波动?(3)我还发现,在进程上使用CPULimit后,无法通过Ctrl + C取消运行,因为它将很快返回以自动运行。想知道为什么?
蒂姆(Tim)

2
关于CPULimit的一个小警告:它使用SIGSTOP / SIGCONT来限制进程使用的CPU时间(超出目标CPU使用率的进程将停止;经过足够的时间后,将向该进程发送SIGCONT并恢复执行)。但是,在极少数情况下,信号会干扰系统调用,有关详细信息,请参见GNU C库手册。由于CPULimit每秒会多次发送这些信号,因此很有可能会中断。在桌面上运行pdftk并不是一个大问题。
Riccardo Murri

8

您可以使用renice正在运行的进程,给它更多或更少的优先级(即所谓的“nice值”)。请注意,UNIX优先级比例有点违反直觉:负值表示进程比并发进程更受青睐,即,它具有“更多”优先级。

因此,您可以尝试通过给定其PID来“减慢”进程:

# lower priority of a process
renice +1 "PID"

每次运行此命令时,过程“ nice value”都会增加1;+1当然可以使用其他整数值。

命令nice允许您以+10 nice的值调整来启动一个过程(使用option进行更改-n)。例如:

# start a CPU-intensive task with low priority
nice ./cpu-hog

但是,“ nice value”仅会影响调度程序比系统中其他进程更喜欢运行特定进程的程度:如果您的计算机基本上处于空闲状态,则提高单个进程的“ nice value” 不会阻止该进程占用100%中央处理器。我引用了getpriority(2)联机帮助页:(我加了强调。)

它们的相对不错的值影响进程调度的程度在Unix系统之间以及在Linux上在内核版本之间都不同。从内核2.6.23开始,Linux采用了一种算法,该算法导致漂亮值的相对差异产生更强的效果。每当系统上有其他 _更高的优先级负载时,这会导致非常低的值(+19)真正为进程提供很少的CPU。

其原因在于进程在类似UNIX的内核上运行的方式:每次内核决定运行某个进程时,该进程在一定(固定和短时间内)都完全控制CPU内核。“ nice值”可以影响内核调度程序愿意多长时间为一个进程分配一个时隙,但是您不能更改这样的事实,即一旦调度,一个进程就会在固定的时间内不受干扰地运行。

因此,如果系统中没有其他可争夺CPU访问权限的进程,那么除了降低CPU的速度外,还无法使进程的运行速度变慢。


谢谢!不管其他进程如何,是否有可能使进程从开始到结束运行缓慢?
蒂姆(Tim)

@Tim我认为您的要求是不可能的;我已经更新了更多详细信息。希望这一点更加清楚。
里卡多·穆里

1
另一个答复是建议使用CPULimit,这似乎无法完成。
蒂姆(Tim)

啊,我不了解CPULimit-它确实填补了我的UNIX工具集中的空白。
Riccardo Murri

nice不会做任何事情来保持处理器凉爽。它并非旨在那样工作。
肯·夏普

4

正是出于这个原因创建了cgroup

http://www.kernel.org/doc/Documentation/cgroups/ http://www.serverwatch.com/tutorials/article.php/3921001/Setting-Up-Linux-Cgroups.htm

您需要花一点时间来熟悉它们,并且我相信您需要root权限来设置它们,但是可以全部编写脚本。较新的Ubuntu具有.conf文件,因此您不必编写自己的脚本。我不确定10.10。

一个很好的起点是这个答案:https : //askubuntu.com/a/94743/170177

请注意,cgroups仍在积极开发中,因此某些功能可能在当前内核中不可用。

使用cgroups的cpu.shares不会执行任何好的值不会做的事情。听起来您想实际限制流程,这绝对可以做到。

您将需要使用一个或两个脚本,和/或编辑/etc/cgconfig.conf来定义所需的参数。

具体来说,您要编辑值cpu.cfs_period_uscpu.cfs_quota_us。然后,该过程将被允许用于运行cpu.cfs_quota_us每微秒cpu.cfs_period_us微秒。

例如:

如果cpu.cfs_period_us = 50000cpu.cfs_quota_us = 10000,则该进程将获得最大20%的CPU时间,无论发生了什么。

在此屏幕截图中,我给了进程2%的CPU时间:

2%CPU时间

就流程而言,它以100%运行。

另一方面,设置cpu.shares可以并且仍将使用100%的空闲CPU时间。

在这个类似的示例中,我给出了进程cpu.shares = 100(共1024个):

中央处理器

如您所见,该进程仍在消耗所有空闲CPU时间。

参考文献:

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups .html


注意:systemd事情有些不同。例如,Ubuntu Trusty似乎提供了两个服务来管理cgroup。我会在知道更多时更新。
肯·夏普

但是,您可以在进程已开始时更改最大cpu%,例如renice
马可·苏拉

renice不会更改使用的CPU数量,而只是更改调度程序中进程的优先级。cgroups可以随时更改CPU限制。自从发布此答案以来,cgroup进行了各种调整,功能非常强大。
肯·夏普

renice does not change the amount of CPU uses我知道;)我只是发布了一个在运行时更改内容的程序示例。感谢您的答复,我将尝试cgroups。
Marco Sulla,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.