web-dev-qa-db-ja.com

同じシェルを使用しない限り、niceはLinuxでは効果がありません

2つ入力すると異なるルート端末:

Nice -n 19 burnK7 &

そして

Nice -n -19 burnK7 &

次に、両方のプロセスが使用可能なCPU時間の約50%を受け取ります。これは予期されておらず、確かに望ましくありません。

同じルートターミナルで実行した場合:

 Nice -n 19 burnK7 &
 Nice -n -19 burnK7 &

予想どおり、最初のプロセスは約0%を受け取り、2番目のプロセスは使用可能なCPU時間の約100%を受け取ります。

これはバグですか、それとも機能ですか?

カーネルのバージョン3.16を搭載したArchLinuxを、その価値のためにシングルコアマシンで実行しています。

4
Fela Maslen

それで、事後、ここにいくつかの情報があります。表示されている動作は、Linux 2.6.38(2010年)で追加された自動グループ機能が原因です。これは、私が追加しようとしているテキストの編集バージョンです sched(7)マニュアルページ これはあなたが見ているものを説明しています。

カーネルは、自動グループ化と呼ばれる機能を提供し、多数の並列ビルドプロセス(つまり、make(1) -jフラグ)を使用してLinuxカーネルをビルドするなど、マルチプロセスでCPUを集中的に使用するワークロードに直面したときにインタラクティブなデスクトップパフォーマンスを向上させます。

setsid(2)を介して新しいセッションが作成されると、新しい自動グループが作成されます。これは、たとえば、新しいターミナルウィンドウが開始されたときに発生します。 fork(2)によって作成された新しいプロセスは、その親の自動グループメンバーシップを継承します。したがって、セッション内のすべてのプロセスは同じ自動グループのメンバーです。

自動グループ化を有効にすると、自動グループのすべてのメンバーが同じカーネルスケジューラの「タスクグループ」に配置されます。 Linuxカーネルスケジューラは、タスクグループ間でCPUサイクルの分散を均等化するアルゴリズムを採用しています。インタラクティブなデスクトップパフォーマンスに対するこれの利点は、次の例で説明できます。

同じCPUをめぐって競合する2つの自動グループがあるとします(つまり、単一のCPUシステム、またはtaskset(1)を使用してすべてのプロセスをSMPシステム上の同じCPUに限定するとします)。最初のグループには、_make -j10_で始まるカーネルビルドからの10個のCPUバウンドプロセスが含まれています。もう1つには、CPUにバインドされた単一のプロセス(ビデオプレーヤー)が含まれています。自動グループ化の効果は、2つのグループがそれぞれCPUサイクルの半分を受け取ることです。つまり、ビデオプレーヤーはCPUサイクルの9%ではなく、50%を受け取ります。これにより、ビデオの再生が低下する可能性があります。 SMPシステムの状況はより複雑ですが、一般的な効果は同じです。スケジューラーはCPUサイクルをタスクグループに分散し、多数のCPUバウンドプロセスを含む自動グループがCPUサイクルを犠牲にして占有することはありません。システム上の他のジョブの。

ニースの値とグループのスケジューリング

非リアルタイムプロセス(たとえば、デフォルトの_SCHED_OTHER_ポリシーでスケジュールされたプロセス)をスケジュールする場合、スケジューラーは「グループスケジューリング」と呼ばれる手法を採用し、スレッドは「タスクグループ」でスケジュールされます。タスクグループはさまざまな状況で形成され、ここでの関連するケースは自動グループ化です。

自動グループ化が有効になっている場合、自動グループ(つまり、setsid(2)によって作成された同じセッション)に(暗黙的に)配置されるすべてのスレッドがタスクグループを形成します。したがって、新しい自動グループはそれぞれ個別のタスクグループになります。

グループスケジューリングでは、スレッドのNice値は、スケジューリングの決定に影響します同じタスクグループ内の他のスレッドに対してのみ。これは、UNIXシステムでのNice値の従来のセマンティクスに関していくつかの驚くべき結果をもたらします。特に、自動グループ化が有効になっている場合(これはさまざまなディストリビューションのデフォルトです)、プロセスでNice(1)を使用すると、同じセッションで実行される他のプロセス(通常は同じ端末)との相対的なスケジューリングにのみ効果があります。窓)。

逆に、(たとえば)異なるセッションで唯一のCPUバウンドプロセスである2つのプロセス(たとえば、それぞれのジョブが異なる自動グループに関連付けられている異なるターミナルウィンドウ)の場合、セッションの1つでプロセスのNice値を変更します他のセッションのプロセスに関連するスケジューラーの決定に関しては効果がありません。

ここで説明するように、自動グループ化が従来のNiceの動作に干渉するのを防ぎたい場合は、この機能を無効にすることができます

_echo 0 > /proc/sys/kernel/sched_autogroup_enabled
_

ただし、これには、自動グループ機能が提供することを目的としたデスクトップの対話性の利点を無効にする効果もあることに注意してください(上記を参照)。

自動グループのNice値

プロセスの自動グループメンバーシップは、ファイル_/proc/[pid]/autogroup_を介して表示できます。

_$ cat /proc/1/autogroup
/autogroup-1 Nice 0
_

このファイルを使用して、自動グループに割り当てられたCPU帯域幅を変更することもできます。これは、「Nice」範囲の数値をファイルに書き込んで、自動グループのNice値を設定することによって行われます。許可される範囲は、+ 19(優先度が低い)から-20(優先度が高い)です。

自動グループのNice設定は、プロセスのNice値と同じ意味ですが、他の自動グループの相対的なNice値に基づいて、自動グループ全体へのCPUサイクルの分散に適用されます。自動グループ内のプロセスの場合、受け取るCPUサイクルは、自動グループのNice値(他の自動グループと比較)とプロセスのNice値(同じ自動グループ内の他のプロセスと比較)の積になります。

8
mtk