web-dev-qa-db-ja.com

Niceレベルとsystemctl CPUSharesプロパティの違い

私が理解しているように(間違っていた場合は訂正してください)、

systemctl set-property ... CPUShares=some_value

cgroupユニット全体のCPU時間を制限します。代わりに、そのユニット内のプロセスのCPU時間を制限したい場合は、次のコマンドでプロセスを実行できます。

systemd-run ... Nice=some_value

プロセスのナイス値とプロセスグループのCPUShares値の概念に本質的な違いがあるかどうか疑問に思っていますか?プロセスのCPUShareを制限したり、cgroupユニットのNice-valueを設定したりできますか?いつどちらを実行したいですか?

8
embedded_crysis

man systemd-runを読み取ると、service、つまりcgroupが即座に作成されます。 systemd.execの読み取りから、Nice=ディレクティブはall実行されたプロセスに適用されるため、systmdNice=およびCPUShares=の概念を処理する方法は非常に似ています。

関係についての私の理解は、歴史と関係があるということです。 Niceは数十年前から存在し、常に特定のプロセスに適用されています。

一方、cgroupsの概念とCPUShares=をプロセスグループに適用するという考え方は、はるかに新しい概念ですが、同じ目標を達成します。

過去の互換性のため、systemdNice=をサポートしていると思います。

混乱を避けるために、どちらか使いやすい方を使用しますが、両方は使用しません。好みがない場合は、新しいCPUShares=コンセプトを使用します。

9
Mark Stosberg

Linuxでは、

  • nice値は、プロセスまたはスレッドである task に適用されます(明確化についてはリンクを参照してください)。
  • 「CPUシェア」の値はcgroup(1つ以上のタスクのグループ)に適用されます。

デフォルトの非リアルタイムLinuxのタスクスケジューラ(CFQ)は、CPU時間をさまざまなcgroup間で「公平に」分散します。他のcgroupのcpu.shares値と比較して、各cgroupのcpu.shares値(デフォルトでは1024)を使用して、各cgroupに多かれ少なかれCPU時間を割り当てます(より多くの共有=より多くのCPU帯域幅)。

ここで、各cgroup内で、タスクのNice値を使用して、他のタスクのNice値同じcgroup内。

sched(7) は言う:

グループスケジューリングでは、スレッドのNice値は、同じタスクグループ内の他のスレッドに関連する決定のみをスケジューリングするために影響します。


サイドノート:

  • aタスクグループはcgroupまたはautogroupです( sched(7) を参照)、
  • linuxディストリビューションのデフォルト設定により、自動グループ化が無効になっている可能性があります。cat /proc/sys/kernel/sched_autogroup_enabledで確認してください。
  • タスクグループは、私が推測CFQタスクスケジューラがCPU時間を分散すると見なす階層関係(cgroup内のcgroup)を持つことができます。
  • 「最近の」ディストリビューションでは、systemdを使用してデフォルトでタスクをcgroupに配置している可能性があります(systemd-cgtopおよびsystemd-cglsを試してください)。
7
Totor