7

内部にいくつかの計算を含む無限ループだけで構成され、I/O 操作を実行しないテスト プログラムを作成しました。プログラムの 2 つのインスタンスを開始してみました。

sudo nice -n 19 taskset 1 ./test
sudo nice -n -20 taskset 1 ./test

taskset コマンドにより、両方のプログラムが同じコアで実行されるようになります。私の予想に反して、両方のプログラムが計算時間の約 50% を取得するというトップ レポートがあります。何故ですか?素敵なコマンドは効果がありますか?

4

5 に答える 5

7

あなたが見ている動作は、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 サイクルは、オートグループのナイス値 (他のオートグループと比較) とプロセスのナイス値 (同じオートグループ内の他のプロセスと比較) の積になります。

于 2016-12-04T11:06:57.103 に答える
2

私はtest.cをまとめました。

for(;;)
   {
   }

そして、あなたのナイスと一緒にそれを実行しました。それぞれに異なるsudoを実行するのではなく、インタラクティブシェルをsudoして、そこから両方を実行しました。2つの&を使用しました。

1つの./testがCPUに強くぶつかり、もう1つはほとんど触れませんでした。

当然のことながら、システムは依然として非常に応答性が高いと感じました。最新のプロセッサでは、「感じる」ことができるほど多くの負荷を取得するには、CPUを大量に消費するプロセスが必要です。

これは、I/Oホギングプロセスやメモリホギングプロセスとは対照的です。このような場合、単一の貪欲なプロセスにより、システムの使用が困難になる可能性があります。

あなたのシステムに比較的ユニークな優先度関連のバグ(または微妙な点)があるか、あなたの方法論に何か問題があると思います。

Ubuntu11.04システムでテストを実行しました。

于 2012-04-26T23:51:24.023 に答える
1

&コマンドラインの最後に欠落があると思います。そうしないと、最初の行が完了するまで 2 行目が実行されません。

両方のプロセスが実行されている間に、次のようなものを使用topして、それぞれに割り当てたナイス値があることを確認します。

only を使用してプロセスを起動し、実行後に でtaskset優先順位を調整するとreniceどうなりますか?

于 2012-04-26T23:03:46.867 に答える