アイドル状態のマシンでPerlスクリプトを使用してCPU使用率を制御することは可能ですか?
同様some.pl 50
に、50%のCPUsome.pl 100
を消費し、100%のCPUを消費します。
アイドル状態のマシンでPerlスクリプトを使用してCPU使用率を制御することは可能ですか?
同様some.pl 50
に、50%のCPUsome.pl 100
を消費し、100%のCPUを消費します。
使用するCPUの量をプロセスに実際に伝えることはできません。代わりに、Unixは優先システムを使用してCPUを割り当てます。優先度の高いプロセスは、優先度の低いプロセスよりも多くのCPU時間を取得します。優先度の低いプログラムはいいと言われています。プログラムの優先度は、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%になります。
唯一の例外はマルチプロセッサマシンで、シングルスレッドプロセスは1つのCPUコアの100%しか取得しません。
これは大まかに次のように概算できます
while (1) {
if ($load < .5) {
... do something ...
} else {
sleep(10);
}
}
十分な負荷をかけるには、おそらくこれらを複数実行する必要があります。残りの課題は、負荷を大幅に増加させる「何かを行う」方法ですが、実行時間は数秒で、大量のメモリやI / O(素因数分解?)を必要としません。
OSにBSDレイヤーがある場合は、http://metacpan.org/pod/BSD ::Resourceを使用してください。
Schwernは正しい答えを持っていますが、何かを試したい場合は、プラグインを制御する別のスレッドを使用することをお勧めします。私の意見では、実際のコードに触れてはいけません。代わりに、CPUが特定のレベルを超えるたびに割り込みまたはイベントを生成する、コードの最初からスレッドを開始しようとします。もちろん、それは決して簡単なことではなく、スレッドと(おそらく)セマフォについてのかなりの知識が必要です。唯一の利点は、そのサブルーチンをうまく作成すれば、他のプラグインでも使用できることです。