あなたが見ている動作は、Linux 2.6.38 (2010 年) で追加された autogroup 機能によるものであることはほぼ確実です。おそらく、2 つのコマンドの実行について説明したとき、それらは異なるターミナル ウィンドウで実行されました。それらを同じターミナル ウィンドウで実行した場合は、nice 値の効果が見られるはずです。この回答の残りの部分で、ストーリーを詳しく説明します。
カーネルは、自動グループ化と呼ばれる機能を提供し、多数の並列ビルド プロセス (つまり、make(1) -j
フラグ) を使用して Linux カーネルをビルドするなど、マルチプロセスで CPU を集中的に使用するワークロードに直面して、対話型デスクトップのパフォーマンスを向上させます。
を介して新しいセッションが作成されると、新しいオートグループが作成されsetsid(2)
ます。これは、たとえば、新しいターミナル ウィンドウが開始されたときに発生します。によって作成された新しいプロセスは、fork(2)
その親の autogroup メンバーシップを継承します。したがって、セッション内のすべてのプロセスは同じ autogroup のメンバーです。
自動グループ化を有効にすると、自動グループのすべてのメンバーが同じカーネル スケジューラの「タスク グループ」に配置されます。Linux カーネル スケジューラは、タスク グループ間で CPU サイクルの配分を均等化するアルゴリズムを採用しています。対話型デスクトップのパフォーマンスに対するこの利点は、次の例で説明できます。
同じ CPU をめぐって競合する 2 つのオートグループがあるとします (つまり、単一の CPU システムであるか、taskset(1)
SMP システム上の同じ CPU にすべてのプロセスを制限するために を使用していると仮定します)。最初のグループには、カーネル ビルドからの 10 個の CPU バウンド プロセスが含まれています。make -j10
. もう 1 つは、ビデオ プレーヤーという 1 つの CPU バウンド プロセスを含みます。自動グループ化の効果は、2 つのグループがそれぞれ CPU サイクルの半分を受け取ることです。つまり、ビデオ プレーヤーは、CPU サイクルの 9% だけではなく、50% の CPU サイクルを受け取ることになり、ビデオ再生のパフォーマンスが低下する可能性があります。SMP システムでの状況はより複雑ですが、一般的な効果は同じです。スケジューラは、多数の CPU バウンド プロセスを含む自動グループが CPU サイクルを占有してしまうことのないように、タスク グループ全体に CPU サイクルを分散します。システム上の他のジョブの。
素敵な価値とグループ スケジューリング
非リアルタイム プロセス (たとえば、デフォルトSCHED_OTHER
ポリシーでスケジュールされたプロセス) をスケジュールする場合、スケジューラは「グループ スケジューリング」と呼ばれる手法を使用します。この手法では、スレッドは「タスク グループ」でスケジュールされます。タスク グループはさまざまな状況で形成されますが、ここで関連するケースは自動グループ化です。
自動グループ化が有効な場合、自動グループに (暗黙的に) 配置されたすべてのスレッド (つまり、 によって作成された同じセッションsetsid(2)
) がタスク グループを形成します。したがって、新しいオートグループはそれぞれ別個のタスク グループになります。
グループ スケジューリングでは、スレッドのナイス値は、同じタスク グループ内の他のスレッドに関連するスケジューリングの決定にのみ影響します。これは、UNIX システムでの nice 値の伝統的なセマンティクスに関して、いくつかの驚くべき結果をもたらします。特に、自動グループ化が有効になっている場合 (さまざまな Linux ディストリビューションのデフォルト)、プロセスを使用nice(1)
すると、同じセッション (通常は同じターミナル ウィンドウ) で実行される他のプロセスに関連するスケジューリングにのみ影響します。
逆に、(たとえば) 異なるセッションで唯一の CPU バウンド プロセスである 2 つのプロセス (たとえば、異なる端末ウィンドウで、それぞれのジョブが異なるオートグループに関連付けられている) の場合、セッションの 1 つでプロセスの nice 値を変更します。他のセッションのプロセスに関連するスケジューラの決定に関しては効果がありません。2 つのターミナル ウィンドウを使用することについて明示的に言及していませんが、これはおそらくあなたが見たシナリオです。
ここで説明されているように、自動グループ化が従来の動作に干渉するのを防ぎたい場合はnice
、機能を無効にすることができます
echo 0 > /proc/sys/kernel/sched_autogroup_enabled
ただし、これには、自動グループ機能が提供することを意図したデスクトップの対話機能の利点が無効になるという影響もあることに注意してください (上記を参照)。
autogroup のナイス値
プロセスの autogroup メンバーシップは、ファイルを介して表示できます/proc/[pid]/autogroup
。
$ cat /proc/1/autogroup
/autogroup-1 nice 0
このファイルは、自動グループに割り当てられた CPU 帯域幅を変更するためにも使用できます。これは、オートグループのナイス値を設定するために、「ナイス」範囲の数値をファイルに書き込むことによって行われます。許可される範囲は +19 (低優先度) から -20 (高優先度) です。
autogroup nice 設定は、プロセスの nice 値と同じ意味を持ちますが、他の autogroup の相対的な nice 値に基づいて、autogroup 全体への CPU サイクルの配分に適用されます。オートグループ内のプロセスの場合、プロセスが受け取る CPU サイクルは、オートグループのナイス値 (他のオートグループと比較) とプロセスのナイス値 (同じオートグループ内の他のプロセスと比較) の積になります。