我有一个程序。运行时CPU温度从50摄氏度升至80摄氏度,这是我最关心的问题。
我可以控制CPU频率来减慢它的速度,但其他进程也会减慢,这是我不希望的。
是否可以在不影响其他进程的情况下减慢特定进程的速度以保持 CPU 凉爽?
我的操作系统是 Ubuntu 10.10。
我尝试通过 设置进程的优先级
nice -n 15 myprogram
,但不确定这是否有效。 CPU最高温度为77摄氏度。是否
nice
只设置一个进程相对于其他进程的相对优先级?即,如果其他进程没有运行,这个好的进程会运行得快吗?我想将进程设置为始终运行缓慢。
答案1
CPULimit 正是您所需要的。您启动该程序,然后针对程序名称或 PID 运行 cpulimit,指定您希望限制的百分比。
以下命令将 PID 7777 处的进程的 CPU 使用率限制为 5%。
cpulimit -p 7777 -l 5
或者,您可以使用可执行文件的名称:
cpulimit -e myprogram -l 5
或者可执行文件的绝对路径:
cpulimit -P /path/to/myprogram -l 5
请注意,百分比是所有核心的百分比;因此,如果您有 4 个核心,则可以使用 400%。
答案2
你可以雷尼采给正在运行的进程赋予或多或少的优先级(所谓的“nice value”)。请注意,UNIX 优先级尺度有些违反直觉:负值意味着进程比并发进程更受青睐,即它具有“更多”优先级。
因此,您可以尝试通过以下方式“减慢”给定 PID 的进程:
# lower priority of a process
renice +1 "PID"
每次运行此程序时,进程“nice value”都会增加 1;当然,您可以使用除此之外的整数值+1
。
命令好的允许您以 +10 的良好值调整来启动进程(使用选项更改此值-n
)。例如:
# start a CPU-intensive task with low priority
nice ./cpu-hog
然而,“nice value”仅影响调度程序相对于系统中其他进程更倾向于运行特定进程的程度:如果您的计算机基本上处于空闲状态,则提高单个进程的“nice value”将不是阻止该进程占用 100% CPU。我引用自getpriority(2) 联机帮助页:(重点是我添加的。)
它们的相对好值影响进程调度的程度因 Unix 系统而异,在 Linux 上,因内核版本而异。从内核2.6.23开始,Linux采用了一种算法,该算法使nice值的相对差异产生更强的效果。这会导致非常低的 Nice 值 (+19),从而真正为进程提供很少的 CPU每当有任何其他 _系统上的更高优先级负载._
其原因在于进程在类 UNIX 内核上运行的方式:每次内核决定运行一个进程时,该进程都会在一定(固定且短的)时间内完全控制 CPU 核心。 “nice value”可以影响内核调度程序愿意为进程提供时隙的频率,但您无法改变这样的事实:一旦调度,进程就会在固定的时间内不受干扰地运行。
因此,如果系统中没有其他进程可以争用 CPU 访问权限,除非减慢 CPU 速度,否则无法减慢进程的运行速度。
答案3
cgroups正是出于这个原因而创建的。
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共享不执行任何操作好的价值不行。听起来你想实际限制进程,这绝对可以做到。
您将需要使用一两个脚本,和/或编辑/etc/cgconfig.conf定义您想要的参数。
具体来说,您想要编辑值cpu.cfs_period_us和cpu.cfs_quota_us。然后该进程将被允许运行cpu.cfs_quota_us每微秒cpu.cfs_period_us微秒。
例如:
如果cpu.cfs_period_us = 50000和cpu.cfs_quota_us = 10000那么无论发生什么情况,该进程都会获得最多 20% 的 CPU 时间。
在此屏幕截图中,我为进程分配了 2% 的 CPU 时间:
就进程而言,它正在以 100% 的速度运行。
设置cpu共享另一方面,可以并且仍然会使用 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/throttle-cpu-usage-with-linux-cgroups.html