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時間を得るかを決定します。しかし、それらの値の違いは何ですか?
また、プロセスのこれらの値を操作する方法、およびどのような状況でこれが役立つかについて説明してください。
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」で起動されます。ただし、次のいずれかの方法でプログラムの優先順位を変更できます。
を使用して、必要な優先度でプログラムを起動できます。
Nice -n Nice_value program_name
すでに実行中のプロセスの優先度を変更することもできます
renice -n Nice_value -p process_id
プロセスの優先順位は、プロセッサ時間の管理に関するものです。プロセッサまたは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
簡易回答
PRは優先レベルです。 PRが低いほど、プロセスの優先度は高くなります。
PRは次のように計算されます。
ロングアンサー
プロセスには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
次の出力が表示されます。
図では、PRとNIの値が表示されます。リアルタイム値に対応するPR値-51のプロセスに注意してください。 PR値が「rt」と記載されているプロセスもあります。この値は、実際には-100のPR値に対応します。