web-dev-qa-db-ja.com

トップ出力のニース値と優先度の違い

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.

Nice valueはカーネルのCPUスケジューラキューに関連していることを理解しています。では、Priorityは何を示していますか?おそらくI/Oに関して何か?

11

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

違いは、[〜#〜] pr [〜#〜]がカーネル内の現時点でのプロセスの実際の優先順位であり、[〜#〜] ni [〜#〜]がプロセスが持つべき優先順位をカーネルに示すためのヒントにすぎません。

ほとんどの場合、[〜#〜] pr [〜#〜]値は、次の式で計算できます:PR = 20 + NI。したがって、niceness 3のプロセスの優先度は23(20 + 3)であり、niceness -7のプロセスの優先度は13(20 -7)です。最初のコマンドは、コマンドNice -n 3 topを実行して確認できます。topprocessにNI3およびPR23があることが示されます。しかし、ほとんどのLinuxシステムでNice -n -7 topを実行するには、実際には[〜#〜] pr [〜#〜]の値が低いほど、実際の優先順位が高いため、root権限が必要です。したがって、PR 13のプロセスは、標準の優先度PR20のプロセスよりも優先度が高くなります。そのため、ルートになる必要があります。ただし、非ルートプロセスで許可される最小のniceness値は、/ 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 [〜#〜]の値は、(20-20)〜39(20 + 19)の値を持つことができます。ただし、デフォルトのスケジューリングポリシー(SHED_OTHER)を持つプロセスに対してのみ正しいです。いわゆる「リアルタイム」スケジューリングポリシーを持つプロセスも存在する可能性があります。これらのポリシーはSCHED_RRおよびSCHED_FIFOです。このようなプロセスの[〜#〜] pr [〜#〜]値は0未満です。これは、chrt -r 1 topコマンド(rootである必要があります)を実行することで確認できます。 topプロセスにはPR -2があります。 chrt -r 90 topを実行することもできます。その場合、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 USER PR NI VIRT RES SHR S%CPU%MEM TIME + COMMAND 
 28489 root RT 0 2852 1200 896 R 0 0.1 0:00.01 top

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

すべての例でtopの代わりにhtopを使用することもできます。これはより便利です。 ps -lも使用できますが、リアルタイムと非リアルタイムの優先度を分ける基準点は0ではなく60であるため、Nice -n -20 ps -lは出力します

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 
 4 R 0 28983 28804 0 60-20-1176-pts/6 00:00:00 ps
25
Anton

短い答え

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

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

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

長い答え

normalプロセスとreal timeの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で呼び出されるプロセスになります。

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

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

top

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

(追記:最高の結果を示す写真を投稿したと思いますが、それを行うという評判はありません)

1