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

时间:2012-07-18 05:28:47

标签: perl

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

some.pl 50将消耗50%的cpu,some.pl 100将消耗100%的CPU使用率。

6 个答案:

答案 0 :(得分:8)

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

启动程序来控制程序的优先级
nice some.pl

或者在使用renice运行时更改其优先级。

Windows以不同的方式做事。

答案 1 :(得分: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;
}

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

你可以用

之类的粗略估计
while (1) {
  if ($load < .5) {
    ... do something ...
  } else {
    sleep(10);
  }
}

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

答案 4 :(得分:1)

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

答案 5 :(得分:-1)

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