web-dev-qa-db-ja.com

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

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つの値です。

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

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

99
Byte Commander

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

PR = 20 + NI

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

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

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

NIは、タスクの素晴らしい価値です。

NI-Nice ValueタスクのNice値。負のNice値は優先順位が高いことを意味し、正のNice値は優先順位が低いことを意味します。

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

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

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

    renice -n Nice_value -p process_id
    
98
pl_rock

優先順位とは何ですか?

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

Linuxでは、CPUが実行する必要のあるすべてのタスクを見ているときに、CPUが従うガイドラインを設定できます。これらのガイドラインはnicenessまたはnice valueと呼ばれます。 Linuxのniceスケールは-20から19になります。数値が低いほど、タスクの優先度が高くなります。 nice値が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
26
A.B.

簡易回答

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

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

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

ロングアンサー

プロセスには2つのタイプがあります。normalプロセスとrealtime通常のプロセス(およびそれらのみ)、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で呼び出されます。

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

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

top

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

enter image description here

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

13