プロセス「ナイスネス」対「優先度」


104

を実行するとtop、この(短縮された)出力例が表示されます。

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4586 ipc-adm+  20   0 1303900 605152  92844 S  30,6 29,3   3:52.88 firefox
 3985 ipc-adm+  20   0  258588 124508  63072 S  12,2  6,0   0:40.04 compiz
 3092 root      20   0  172392  56164  25980 S   6,1  2,7   0:30.13 Xorg

私が興味を持っているのは、PR(優先度)とNI(ナイスネス)の2つの値です。

すでにわかったことを正しく理解すれば、両方がプロセスが他のプロセスと比較してどれだけのCPU時間を得るかを決定します。しかし、それらの値の違いは何ですか?

また、プロセスのこれらの値を操作する方法、およびどのような状況でこれが役立つかについて説明してください。

回答:


103

nice値はユーザー空間であり、優先度PRはLinuxカーネルが使用するプロセスの実際の優先度です。Linuxシステムの優先順位は0から139で、リアルタイムでは0から99、ユーザーでは100から139です。nice値の範囲は-20〜+19で、-20が最高、0がデフォルト、+ 19が最低です。nice値と優先順位の関係は次のとおりです。

PR = 20 + NI

そのため、の値はPR = 20 + (-20 to +19)0〜39で、100〜139にマッピングされます。

トップマニュアルによると:

PR-優先度タスクのスケジューリング優先度。このフィールドに「rt」が表示されている場合、タスクが「リアルタイム」のスケジューリング優先度で実行されていることを意味します。

NIはタスクの価値があります。

NI-ナイスバリュータスクのナイスバリュー。負のnice値は優先順位が高いことを意味しますが、正のnice値は優先順位が低いことを意味します。

編集:デフォルトでは、プログラムがLinuxで起動されると、優先度「0」で起動されます。ただし、次のいずれかの方法でプログラムの優先順位を変更できます。

  1. を使用して、必要な優先度でプログラムを起動できます。

    nice -n nice_value program_name
    
  2. すでに実行中のプロセスの優先度を変更することもできます

    renice -n nice_value -p process_id
    

1
あなたは言っています、彼らは逆にほとんど同じものです(両方が優先順位を表します)nicenessが、タスクnicenessが高優先順位タスクの邪魔にならないように負の優先順位を与えるために使用できますか?(すなわち、それがされるniceと、他のアクセスリソースをさせるか、これはちょうど私を混同したのか?
マーク・カービー

1
つまり、2つのタスクは両方ともpr20なので、タスク1はni0、タスク2はni20なので、タスク2はタスク1のリソースを放棄することになります。nicer
マークカービー

1
私が知っているように、優先度はPR = 20 + NIとして計算されます。したがって、タスク1の優先度= 20 +0です。nice willの最大値
+19

3
PR = 20 + NIの最大値は39です。実際、Linuxシステムでは139の優先度があり、0〜99がリアルタイムの優先度であり、ユーザーの場合は100〜139です。したがって、NI値-20〜+19は優先度100〜139にマッピングされます。あなたが調整できること。しかし、カーネルはNI値を変更した場合に優先順位を変更するかどうか不明ですが、NI値はカーネルへの単なる提案です。カーネルは時々無視します
pl_rock

1
それでは、PRとNIは実際には同等であり、オフセットが異なるだけですか?では、なぜ両方の値があるのでしょうか?また、プロセス<0の適切な設定にはルート権限が必要であることを追加できます。
バイトコマンダー

26

優先順位とは何ですか?

プロセスの優先順位は、プロセッサ時間の管理に関するものです。プロセッサまたはCPUは、複数のタスクを同時にジャグリングする人間のようなものです。時には、複数のプロジェクトを引き受けるのに十分なスペースを確保できます。時には、一度に一つのことにしか集中できないことがあります。また、重要なものがポップアップ表示され、バックバーナーにあまり重要でないタスクを配置しながら、その問題を解決するために全力を注ぎたいと思います。

Linuxでは、CPUが実行する必要のあるすべてのタスクを確認するときに、CPUが従うガイドラインを設定できます。これらのガイドラインは、ナイスネスまたはナイスバリューと呼ばれます。Linux niceness scaleは-20から19になります。数値が低いほど、タスクの優先度が高くなります。niceness値が19のような高い数値である場合、タスクは最低の優先度に設定され、CPUは機会があればいつでも処理します。デフォルトのnice値はゼロです。

このスケールを使用することにより、CPUリソースをより適切に割り当てることができます。重要ではない優先度の低いプログラムはより高いnice値に設定でき、デーモンやサービスなどの優先度の高いプログラムはより多くのCPUのフォーカスを受け取るように設定できます。特定のユーザーにすべてのプロセスのナイス値を低くして、コンピューターのコアサービスを遅くする能力を制限することもできます。

ソース

で新しいプロセスの優先度を設定しますnice、例えば

nice -n 10 firefox

既存のプロセス用

renice 10 -p $(pgrep firefox)

<0必要な優先順位を設定するにはsudo、たとえば:

renice -1 -p $(pgrep firefox)
renice: failed to set priority for 2769 (process ID): Permission denied

優先順位ではない >=0


% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          19   0

% renice 10 -p 2769     # note, we don't need sudo here
2769 (process ID) old priority 0, new priority 10

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox           9  10

% sudo renice -19 -p 2769                    
 2769 (process ID) old priority 10, new priority -19

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          38 -19

その他の例

特定のユーザーに対して実行中のすべてのプロセスを放棄するには

renice 20 -u user_name

あなたの例では、renice 10もなしsudoで動作しますか?また、特定のユーザーのすべてのプロセスをより良いものにするための例を追加していただけますか?誰か他の人が同時にログインし、いくつかの不必要ではあるがリソースを消費するプロセスを実行している場合(Firefoxで一時停止したフラッシュゲームのように、弟がそのようなことを行います...:-/)
バイト司令官

@ByteCommander完了=)
AB

しばらくしてそのユーザーの古いniceness値を復元するにはどうすればよいですか?0に戻しますか?一部のプロセスが以前は異なるniceness値を持っていた可能性があることは考慮されません。これを行う簡単な可能性はありますか?
バイトコマンダー

@ByteCommanderいいえ、簡単ではありません。どちらかを使用する0か、...問題があります;)
AB

2
renice -19後、との結果はps次のとおりです。PRI: 38, NI: -19ただし、とtopそれであるPR:1, NI -19ことが、なぜ?
ウェイクアップ

14

簡潔な答え

PRは優先レベルです。PRが低いほど、プロセスの優先度は高くなります。

PRは次のように計算されます。

  • 通常のプロセスの場合:PR = 20 + NI(NIは素晴らしく、範囲は-20から19)
  • リアルタイムプロセスの場合:PR =-1-real_time_priority (real_time_priorityの範囲は1〜99)

ロングアンサー

プロセスには、通常のプロセスとリアルタイムの 2つのタイプがあります。通常のプロセス (およびそれらのプロセスのみ)には、niceが次のように適用されます。

いいね

「ナイスネス」スケールは-20から19になりますが、-20が最高の優先順位で、19が最低の優先順位です。優先度レベルは次のように計算されます。

PR = 20 + NI

NIはナイスレベルで、PRは優先レベルです。ご覧のとおり、-20は実際に0にマッピングされ、19は39にマッピングされます。

デフォルトでは、プログラムのnice値は0ですが、rootユーザーは次のコマンドを使用して、指定されたnice値でプログラムを起動することができます。

nice -n <nice_value> ./myProgram 

リアルタイム

さらに先へ進むことができました。niceプログラムは実際にユーザープログラムに使用されます。UNIX / LINUX全体の優先度には140の値の範囲がありますが、nice値を使用すると、プロセスは範囲の最後の部分(100から139)にマップできます。この式では、0〜99の値に到達できず、負のPRレベル(-100〜-1)に対応します。これらの値にアクセスできるようにするには、プロセスを「リアルタイム」として記述する必要があります。

LINUX環境には5つのスケジューリングポリシーがあり、次のコマンドで表示できます。

chrt -m 

次のリストが表示されます。

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

スケジューリングプロセスは、通常のスケジューリングポリシー(1〜3)とリアルタイムスケジューリングポリシー(4と5)の2つのグループに分けることができます。リアルタイムプロセスは、通常のプロセスよりも常に優先されます。リアルタイムプロセスは、次のコマンドを使用して呼び出すことができます(例は、SCHED_RRポリシーを宣言する方法です)。

chrt --rr <priority between 1-99> ./myProgram

リアルタイムプロセスのPR値を取得するには、次の式が適用されます。

PR = -1-rt_prior

ここで、rt_priorは1〜99の優先度に対応します。そのため、他のプロセスよりも高い優先度を持つプロセスは、番号99で呼び出されます。

リアルタイムプロセスでは、ナイス値は使用されないことに注意することが重要です。

プロセスの現在の「適切さ」とPR値を確認するには、次のコマンドを実行できます。

top

次の出力が表示されます。

ここに画像の説明を入力してください

図では、PRとNIの値が表示されます。リアルタイム値に対応するPR値-51のプロセスに注意してください。PR値が「rt」と記載されているプロセスもあります。この値は、実際には-100のPR値に対応します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.