是否可以在空闲机器中使用 Perl 脚本控制 CPU 使用率?
likesome.pl 50
会消耗50%的cpu,some.pl 100
会消耗100%的cpu使用率。
您无法真正告诉进程要使用多少 CPU。相反,Unix 使用优先级系统分配 CPU。高优先级进程将获得比低优先级进程更多的 CPU 时间。低优先级的程序被称为nice。您可以通过以下方式启动程序来控制程序的优先级nice
...
nice some.pl
或者通过在运行时更改其优先级renice
。
Windows 以不同的方式做事。
是的,当然这是可能的。下面的代码片段计算了某个进程在某一时刻的处理器负载百分比。您可能首先想要收集一定数量的值并将它们平均以获得平滑的结果。
然后简单地说,如果负载不够高,告诉进程做工作,如果负载太高,告诉进程暂停工作。
use constant UTIME => 13;
use constant STIME => 14;
use List::Util qw(sum);
use Time::HiRes qw(sleep);
use autodie qw(:all);
sub pidload {
my ($pid) = @_;
open my $pstat, '<', "/proc/$pid/stat";
my @pstat = split ' ', <$pstat>;
close $pstat;
return $pstat[UTIME] + $pstat[STIME];
}
sub cpuload {
open my $stat, '<', '/proc/stat';
my @total = split ' ', <$stat>;
close $stat;
shift @total;
return sum @total;
}
my ($pid) = @ARGV;
my $prev_cpu = cpuload;
my $prev_pid = pidload $pid;
while (1) {
sleep 0.1;
my $now_pid = pidload $pid;
my $now_cpu = cpuload;
printf "%.0f\n", 100*(($now_pid - $prev_pid) / ($now_cpu - $prev_cpu));
$prev_cpu = $now_cpu;
$prev_pid = $now_pid;
}
在没有任何其他进程的情况下,正在运行的进程将始终获得 100%,除非它以某种方式定期使自己进入睡眠状态。
唯一的例外是多处理器机器,其中单线程进程只能获得一个CPU 内核的 100%。
你可以粗略地用类似的东西来近似这个
while (1) {
if ($load < .5) {
... do something ...
} else {
sleep(10);
}
}
为了建立足够的负载,您可能需要运行其中的一个以上。剩下的挑战是如何“做某事”显着增加负载,但只运行几秒钟,并且不需要大量内存或 I/O(素数分解?)
如果您的操作系统有 BSD 层,只需使用:http ://metacpan.org/pod/BSD::Resource
Schwern 有正确的答案,但如果你想尝试一些东西,我建议你使用一个单独的线程来控制插件。在我看来,实际代码不能被触及。相反,我将尝试在每次 CPU 超过某个级别时生成中断或事件的代码开头启动一个线程。这当然不容易,需要对线程和(也许)信号量有相当的了解。唯一的好处是,如果您编写好该子例程,那么您也可以在其他插件中使用它。