各プロセスのCPU時間を制限したい場合は、タスクをcgroups
実行する2つのパラメータ、およびを渡すことcpu.cfs_period_us
ができますcpu.cfs_quota_us
。
- cpu.cfs_期間_us:帯域幅決定に使用される各スケジューラ期間の期間(マイクロ秒)。デフォルトは100000usまたは100msです。期間が長ければスループットは向上しますが、スケジューラは CPU 集約的なワークロードをより長く維持できるため、待ち時間が長くなります。より短い期間の場合はその逆です。これは、CFSスケジューラによってスケジュールされた非RTジョブにのみ影響します。
- cpu.cfs_quota_us:現在のグループの各cfs_period_us期間中に実行が許可される最大時間(マイクロ秒)。たとえば、CPU_time_usを半分に設定すると、cgroupはその時間の50%しか最大操作を実行できません。これは、システム内のすべてのCPUの合計時間を表します。したがって、たとえば2つのCPUを完全に活用するには、この値をcfs_period_us値の2倍に設定する必要があります。
プロセスをCPUコア1つに制限したいとしましょう。これは次の方法で行うことができます。
cpu.cfs_quota_us 1.000.000
cpu.cfs_period_us 1.000.000
そして
cpu.cfs_quota_us 100.000
cpu.cfs_period_us 100.000
そして
cpu.cfs_quota_us 10.000
cpu.cfs_period_us 10.000
これら3つのオプションの違いは何ですか? Firefoxプロセスがあるとしましょう。cpu.cfs_period_us
もっと長いか短いのは何で、その理由は何ですか?
答え1
引用文が示すように、数字が小さいほど待ち時間が短くなります。プロセスは予約されるまで長く待つ必要はありません。各プロセスはすぐに順番になります。ただし、スケジュールを変更するとコストが高くなります。時間が経過して別のプロセスを実行する準備が整うたびに、スケジュールが変更されます。
スケジュールの変更には、スタック内のすべてのレジスタの保存、スタックポインタのジョブ制御ブロックへの保存、ジョブ制御ブロックの切り替え、仮想ページテーブルの一部の無効化/アクティブ化、スタックポインタの再ロード、およびレジスタの復元が含まれます。さらに、より多くのキャッシュミスが発生する可能性があります。つまり、状況が遅くなります。
長期実行非対話型ジョブの場合、スケジューラー期間が長いほど良いです。バッチスケジューラは、標準の対話型スケジューラよりも予約期間が長く、優先順位が低い。