CPU温度を調整するために1つのプロセスのみを遅くする


9
  1. プログラムがあります。それが実行されているとき、CPU温度は50から80摂氏に上昇します。これは私の大きな懸念です。

    CPU周波数を制御して速度を落とすことはできますが、他のプロセスも速度が落ちるので、必要ありません。

    他のプロセスに影響を与えずに特定のプロセスをスローダウンしてCPUをクールに保つことは可能ですか?

    私のOSはUbuntu 10.10です。

  2. 私はによってプロセスの優先順位を設定しようとしましたが、nice -n 15 myprogramそれが機能するかどうかはわかりません。CPUの高さは77摂氏です。

    ないniceだけで、他のプロセスWRTのプロセスの相対的な優先順位を設定しますか?つまり、他のプロセスが実行されていない場合、この素晴らしいプロセスは高速に実行されますか?プロセス全体が遅くなるように設定したいと思います。


1
このプロセスは何をしますか?重い入力/出力?メインCPUでの重い計算?GPU(ビデオカード)での重い計算(通常、画像を計算するプログラムに限定されません)?
Gilles「SO-邪悪なことをやめなさい」

プログラムはpdf2djvuで、pdfファイルをdjvuに変換します。重いIOですか、重いCPUですか、重いGPUですか?ケースごとに異なる方法がありますか?
Tim

4
80ºは非常に高いです。私はスペインの暑い場所に住んでおり、私のプロセッサーの最高温度は約60ºです。コンピュータを開き、すべての部品を掃除して、クーラーを交換します。私はあなたがCPUを使用しているのではないと思います。
Rufo El Magufo 2011

両方やってみてください。
stribika 2011

80°は実際には高いですが、CPUモデルによっては極端とは見なされません。ほとんどのCPUが問題なく最大90°Cをサポート
Kiwy

回答:


16

CPULimitはまさに必要なものです。プログラムを起動してから、プログラム名またはPIDに対してcpulimitを実行し、制限する割合を指定します。

次のコマンドは、PID 7777でのプロセスを5%のCPU使用に制限します。

cpulimit -p 7777 -l 5

または、実行可能ファイルの名前を使用できます。

cpulimit -e myprogram -l 5

または実行可能ファイルの絶対パス:

cpulimit -P /path/to/myprogram -l 5

パーセンテージはすべてのコアのものであることに注意してください。したがって、4つのコアがある場合、400%を使用できます。


1
ありがとう!(1)CPULimitは既に実行されているプロセスにのみ使用されますか?実行するプログラムを提出するときに使用されませんか?(2)プロセスによるCPUの使用率を修正しますか、またはプロセスの上限を設定して、その使用率を他のプロセスに従って0とその制限の間で変動させますか?(3)プロセスでCPULimitを使用した後、Ctrl + Cで実行をキャンセルする方法がないこともわかりました。これは、すぐに自動的に実行に戻るためです。なぜだろう?
Tim

2
CPULimitに関する小さな警告:これは、SIGSTOP / SIGCONTを使用して、プロセスが使用するCPU時間を制限します(ターゲットCPU使用率を超えるプロセスは停止します。十分な時間が経過すると、プロセスにSIGCONTが送信され、実行が再開されます)。ただし、シグナルがシステムコールに干渉することはまれです。詳細については、GNU Cライブラリマニュアルを参照してください。CPULimitはこれらの信号を1秒に何度も送信するため、割り込みが発生する可能性がかなりあります。デスクトップでpdftkを実行するのはそれほど大きな問題ではありません。
Riccardo Murri、2011

8

実行中のプロセスを再割り当てして、多かれ少なかれ優先順位(いわゆる「ナイスバリュー」)を与えることができます。UNIXの優先度スケールはやや直観に反していることに注意してください。負の値は、プロセスが同時プロセスよりも優先されることを意味します。つまり、「より多くの」優先度があります。

したがって、PIDを指定してプロセスを「スローダウン」することを試みることができます。

# lower priority of a process
renice +1 "PID"

これを実行するたびに、プロセスの「nice value」が1ずつ増加します。+1もちろん、整数値以外も使用できます。

コマンドniceを使用すると、+ 10のnice値を調整してプロセスを開始できます(オプションでこれを変更します-n)。例えば:

# start a CPU-intensive task with low priority
nice ./cpu-hog

ただし、「ナイスバリュー」は、スケジューラがシステム内の他のプロセスよりも特定のプロセスの実行を優先する程度にのみ影響します。コンピュータが基本的にアイドリングの場合、1つのプロセスの「ナイスバリュー」を上げても、そのプロセスが100%を占めることはありません。 CPU。私はgetpriority(2)のマンページから引用します:(Emphasis added me。)

それらの相対的なnice値がプロセスのスケジューリングに影響する度合いは、Unixシステム間で、またLinuxではカーネルバージョン間で異なります。カーネル2.6.23から、Linuxは、nice値の相対的な違いがはるかに強い効果を持つアルゴリズムを採用しました。これにより、非常に低いnice値(+19)が原因 で、システムに他の _より高い優先度の負荷がある場合は常に、CPUがプロセスにほとんど提供されなくなります。

この理由は、プロセスがUNIXのようなカーネルで実行される方法にあります。カーネルがプロセスを実行することを決定するたびに、そのプロセスは一定の(固定された短い)期間CPUコアを完全に制御します。「適切な値」は、カーネルスケジューラがプロセスにタイムスロットを割り当てようとする頻度に影響を与える可能性がありますが、一度スケジュールされると、プロセスが一定時間影響を受けずに実行されるという事実を変更することはできません。

したがって、CPUの速度を落とす以外に、CPUアクセスを争うシステムに他のプロセスがない場合、プロセスの実行を遅くする方法はありません。


ありがとう!他のプロセスに関係なく、プロセスを最初から最後まで遅く実行することは可能ですか?
Tim

@ティム私はあなたが求めることは可能だとは思わない。回答を詳細に更新しました。それがより明確になることを願っています。
Riccardo Murri、2011

1
もう1つの応答はCPULimitを提案しましたが、これは不可能なことをしているようです。
Tim

ああ、私はCPULimitについて知りませんでした-それは間違いなく私のUNIXツールセットのギャップを埋めます。
Riccardo Murri、2011

niceプロセッサーをクールに保つことはできません。そのように機能するようには設計されていません。
Ken Sharp

4

cgroupはまさにこの理由で作成されました。

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.sharesを使用しても、適切値では実行できないことはありません。実際にプロセスを抑制したいようですが、それは間違いなく実行できます。

1つまたは2つのスクリプトを使用するか、/または/etc/cgconfig.confを編集して必要なパラメータを定義する必要があります。

具体的には、値cpu.cfs_period_usおよびcpu.cfs_quota_usを編集します。その後、プロセスは、cpu.cfs_period_usマイクロ秒あたりcpu.cfs_quota_usマイクロ秒実行されます。

例えば:

もしcpu.cfs_period_us = 50000cpu.cfs_quota_usは= 10000その後、プロセスは関係なく起こっている他に何のCPU時間の最大値の20%を、受け取ることになります。

このスクリーンショットでは、CPU時間の2%のプロセスを示しています。

2%のCPU時間

プロセスに関する限り、プロセスは100%で実行されています。

一方、cpu.sharesの設定では、アイドルCPU時間の100%を使用できます。

この同様の例では、プロセスcpu.shares = 100(1024のうち)を指定しています。

cpu.shares

ご覧のように、プロセスはまだすべてのアイドルCPU時間を消費しています。

参照:

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups .html


注:systemd少し異なります。たとえば、Ubuntu Trustyには、cgroupを管理するための2つのサービスが付属しているようです。詳細がわかり次第、更新します。
ケンシャープ

ただし、プロセスがすでに開始されている場合は、最大cpu%を変更できreniceますか?
Marco Sulla

renice使用されるCPUの量は変更されません。スケジューラーのプロセスの優先順位が変更されるだけです。cgroupはいつでもCPU制限を変更できます。この回答が投稿されて以来、cgroupにはあらゆる種類の調整が加えられており、非常に強力です。
ケンシャープ

renice does not change the amount of CPU uses私はそれを知っています;)私は実行時に物事を変更するプログラムの例として投稿しました。返信ありがとうございます。cgroupsを試してみます。
Marco Sulla
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.