プロセスあたりのCPU時間を制限したい場合は、cgroups
を介して行うことができます。ジョブを実行できるパラメーターは2つあります。cpu.cfs_period_us
およびcpu.cfs_quota_us
。
- cpu.cfs_period_us:帯域幅を決定するための、各スケジューラー期間のマイクロ秒単位の期間。これはデフォルトで100000usまたは100msになります。スケジューラーはCPUにバインドされたワークロードをより長く維持できるため、期間を長くすると、レイテンシーを犠牲にしてスループットが向上します。短い期間の場合はtrueの反対です。これは、CFSスケジューラによってスケジュールされた非RTタスクにのみ影響することに注意してください。
- cpu.cfs_quota_us:現在のグループの各cfs_period_usのマイクロ秒単位の最大時間の実行が許可されます。たとえば、cpu_period_usの半分に設定されている場合、cgroupは50%の時間しかピーク実行できません。これは、システム内のすべてのCPUの合計時間を表すことに注意してください。したがって、たとえば2つのCPUを完全に使用できるようにするには、この値をcfs_period_usの値の2倍に設定する必要があります。
プロセスを1CPUコアに制限したいとします。これは、次の方法で実行できます。
cpu.cfs_quota_us 1.000.000
cpu.cfs_period_us 1.000.000
vs.
cpu.cfs_quota_us 100.000
cpu.cfs_period_us 100.000
vs.
cpu.cfs_quota_us 10.000
cpu.cfs_period_us 10.000
3つのオプションの違いは何ですか? Firefoxプロセスがあるとしましょう。何cpu.cfs_period_us
はそれよりも優れています-長いか短いか、そしてその理由は?
引用が言うように、数値が小さいほどレイテンシーは低くなります。プロセスは、スケジュールされるまで長く待つ必要はありません。すべてのプロセスがすぐに順番になります。ただし、再スケジュールのオーバーヘッドはさらに大きくなります。時間がなくなるたびに、実行する準備ができている他のプロセスがある場合は、再スケジュールがあります。
再スケジュールには、スタック上のすべてのレジスタの保存、スタックポインタのタスク制御ブロックへの保存、タスク制御ブロックの切り替え、仮想ページテーブルの一部の無効化/有効化、スタックポインタの再読み込みが含まれます。レジスタを復元します。また、キャッシュミスが増える可能性もあります。つまり、実行速度が遅くなります。
長時間実行される非対話型タスクの場合、スケジューラー期間を長くすることをお勧めします。バッチスケジューラはスケジューラ期間が長く、標準のインタラクティブスケジューラよりも低い優先度で実行されます。