トップ出力のnice値と優先度の違い


11

topは、デフォルトで両方の列をリストします。何が違うのか知りたいです。私はマニュアルページをチェックアウトしましたが、理解できません:

優先:

   h: PR  --  Priority
      The priority of the task.

いい値:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

ニース値はカーネルのCPUスケジューラキューに関連していることを理解しています。次に、優先度は何を示していますか?I / Oに関する何か?

回答:


8

nice値は「グローバル」メカニズムですが、優先度は現在、タスクスイッチャーに関連しています。


タスクスイッチャーとはどういう意味ですか?
ベルミンフェルナンデス

1
タスクスイッチャー(正しくは「スケジューラー」と呼ばれます)は、次に実行するタスクを決定するカーネル内の小さなコードです。
Ignacio Vazquez-Abrams

25

違いは、PRはカーネル内の現時点でのプロセスの実際の優先順位であり、NIはカーネルがプロセスの優先順位をどのように持つべきかについてのヒントにすぎないことです。

ほとんどの場合、PR値は次の式で計算できます:PR = 20 + NI。したがって、niceness 3のプロセスの優先度は23(20 + 3)で、niceness -7のプロセスの優先度は13(20-7)です。コマンドを実行することで、最初のものを確認できnice -n 3 topます。これは、その表示されますトップのプロセスが持つNI 3PR 23。しかしnice -n -7 top、ほとんどのLinuxシステムで実行するには、実際にはPR値が低いほど優先順位が高いため、root権限が必要です。したがって、PR 13のプロセスは、標準優先順位PR 20のプロセスよりも高い優先順位を持ちます。。そのため、ルートになる必要があります。しかし、非ルート・プロセスのために許容される最小値はnice値に設定することができます/etc/security/limits.confを

理論的には、カーネルはそれ自体でPR値を変更できます(NIは変更できません)。たとえば、CPUの消費量が多すぎる場合はプロセスの優先度を下げ、他の優先度の高いプロセスが原因でそのプロセスが長時間実行する機会がなかった場合はプロセスの優先度を上げます。これらの場合、PR値はカーネルによって変更され、NIは同じままであるため、「PR = 20 + NI」という式は正しくありません。したがって、NI値はプロセスの優先度をカーネルに示すヒントとして解釈できますが、カーネルは状況に応じて独自に実際の優先度(PR値)を選択できます。しかし、通常は式「PR = 20 + NI」は正しいです。

カーネルが優先度を変更する方法の正確なルールは明確ではありません。setpriority(nice値を変更する関数)マニュアルには次のように書かれています:

nice値を変更した場合の効果は、有効なプロセススケジューリングアルゴリズムによって異なります。

Pthreadのマニュアルには次のように書かれています:

動的優先順位はnice値(nice(2)、setpriority(2)、またはsched_setattr(2)によって設定)に基づいており、スレッドが実行する準備ができているが、スケジューラによって実行が拒否されるたびに増加します。

PR値は動的優先度に対応しているようです。

NI値の範囲は-20..19です。したがって、PR値は0(20-20)〜39(20 + 19)の値を持つことができます。しかし、それはデフォルトのスケジューリングポリシー(SHED_OTHER)を持つプロセスに対してのみ正しいです。いわゆる「リアルタイム」スケジューリングポリシーを持つプロセスも存在する可能性があります。これらのポリシーはSCHED_RRおよびSCHED_FIFOです。このようなプロセスのPR値は0未満です。これを確認するには、chrt -r 1 topコマンドを実行します(rootである必要があります)。一番上のプロセスはPR -2になります。あなたchrt -r 90 topはその場合でもトップを実行することができますプロセスはPR -91になります。

のためと思われSCHED_RRは、処理PRの値が、式で計算することができます。

PR =-1-sched_rr_priority

したがって、SCHED_RRプロセスには少なくともPR -1があります。これは、どのSCHED_RRプロセスにも、どのSCHED_OTHERよりも高い優先順位があることを意味します。これはpthreadマニュアルに対応します。

SCHED_FIFOは、0より高い静的優先度でのみ使用できます。つまり、SCHED_FIFOスレッドが実行可能になると、現在実行中のSCHED_OTHER、SCHED_BATCH、またはSCHED_IDLEスレッドが常にすぐに優先されます。

SCHED_RRは、SCHED_FIFOを単純に拡張したものです。SCHED_FIFOについて上記で説明したすべてがSCHED_RRにも適用されます。

リアルタイムプロセスの優先度は、カーネルによって変更できない静的優先度と呼ばれます。したがって、正のPR値は非リアルタイム(SCHED_OTHERSCHED_BATCH)プロセスの動的優先順位として、負のPR値はリアルタイムプロセス(SCHED_RRSCHED_FIFO)の静的優先順位として扱うことができます。

私も実行しようとしましたnice -n 10 chrt -r 50 top(およびchrt -r 50 nice -n 10 top)。NIの値は10だったが、PRはまだあった-51。したがって、NI値はSCHED_RRプロセスの優先度に影響を与えないようです。これはsetpriorityマニュアルに対応します。

SCHED_FIFOまたはSCHED_RRを使用するプロセスまたはスレッドは、setpriority()の呼び出しによる影響を受けません。これはエラーとは見なされません。その後SCHED_OTHERに戻るプロセスは、そのようなsetpriority()呼び出しによって影響を受ける優先順位を持つ必要はありません。

1つの面白いメモ。を実行chrt -r 99 topすると、PR列に数値ではなくRT値が表示されます。

  PIDユーザーPR NI VIRT RES SHR S%CPU%MEM TIME +コマンド
28489ルートRT 0 2852 1200 896 R 0 0.1 0:00.01上

これがプロセスが特別になったという意味ではないと思います。これは、topが-100を印刷しないことを意味すると思います。印刷に4文字かかるからです。

すべての例で、topの代わりにhtopを使用することもできます。も使用できますが、リアルタイムと非リアルタイムの優先順位を分離する基点は0ではなく60なので、印刷されますps -lnice -n -20 ps -l

FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY時間CMD
4 R 0 28983 28804 0 60-20-1176-pts / 6 00:00:00 ps

奇妙なことに、2コアのハイパースレッドi3で5つの無限ループ(int main {while(1);})を実行しても、優先順位は変わりません。これはdebian sidテストで。
Vorac

1
@BelminFernandez私はこの答えを「受け入れる」ことは公平だと思います。
z0lupka

1

簡潔な答え

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

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

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

長い答え

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

いいね

"niceness"スケールは-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)にマップできます。この方程式では、負のPRレベル(-100から-1)に対応する0〜99の値に到達できません。これらの値にアクセスできるようにするには、プロセスを「リアルタイム」と記述する必要があります。

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値が-51のプロセスは、リアルタイム値に対応することに注意してください。PR値が「rt」と記載されているプロセスもいくつかあります。この値は実際には-100のPR値に対応します。

(追記:上位の結果を示す画像を投稿したはずですが、その評判はありません)

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