2

是否可以在空闲机器中使用 Perl 脚本控制 CPU 使用率?

likesome.pl 50会消耗50%的cpu,some.pl 100会消耗100%的cpu使用率。

4

6 回答 6

8

您无法真正告诉进程要使用多少 CPU。相反,Unix 使用优先级系统分配 CPU。高优先级进程将获得比低优先级进程更多的 CPU 时间。低优先级的程序被称为nice。您可以通过以下方式启动程序来控制程序的优先级nice...

nice some.pl

或者通过在运行时更改其优先级renice

Windows 以不同的方式做事。

于 2012-07-18T06:04:35.237 回答
4

是的,当然这是可能的。下面的代码片段计算了某个进程在某一时刻的处理器负载百分比。您可能首先想要收集一定数量的值并将它们平均以获得平滑的结果。

然后简单地说,如果负载不够高,告诉进程做工作,如果负载太高,告诉进程暂停工作。

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;
}
于 2012-07-18T08:57:03.823 回答
2

在没有任何其他进程的情况下,正在运行的进程将始终获得 100%,除非它以某种方式定期使自己进入睡眠状态。

唯一的例外是多处理器机器,其中单线程进程只能获得一个CPU 内核的 100%。

于 2012-07-18T06:09:03.270 回答
1

你可以粗略地用类似的东西来近似这个

while (1) {
  if ($load < .5) {
    ... do something ...
  } else {
    sleep(10);
  }
}

为了建立足够的负载,您可能需要运行其中的一个以上。剩下的挑战是如何“做某事”显着增加负载,但只运行几秒钟,并且不需要大量内存或 I/O(素数分解?)

于 2012-07-18T07:41:21.037 回答
1

如果您的操作系统有 BSD 层,只需使用:http ://metacpan.org/pod/BSD::Resource

于 2012-07-18T21:51:09.777 回答
-1

Schwern 有正确的答案,但如果你想尝试一些东西,我建议你使用一个单独的线程来控制插件。在我看来,实际代码不能被触及。相反,我将尝试在每次 CPU 超过某个级别时生成中断或事件的代码开头启动一个线程。这当然不容易,需要对线程和(也许)信号量有相当的了解。唯一的好处是,如果您编写好该子例程,那么您也可以在其他插件中使用它。

于 2012-07-18T08:11:53.970 回答