web-dev-qa-db-ja.com

systemdサービスをCPUで「ニース」に制限する方法は?

CPUを集中的に使用するジョブでシステムを停止させる傾向があるsystemdサービス(CIランナー)があります。ちょうど平均で100を超えて飛んでいる負荷平均をキャッチし、そのナンセンスを停止したいと思います。

システム上の他のものが制限されることはないので、現在のように他のすべてを続行したいということですが、次のいずれかになります。

  • (a)CIジョブが実行される固有のユーザーとして実行されるすべてのプロセスまたは
  • (b)systemdサービスデーモンによってインスタンス化された子プロセス

...システム上の他のすべてのものに2番目のフィドルを再生します。実際には、システムにCPUサイクルの残り10%を必要とするものがない場合でも、90%の絶対キャップのようなものにしたいのですが、CPU時間を要求するものがあれば、できるだけ多くのCPUを取得したいと思います。彼らは最初に欲しい。

これを設定する最良の方法は何ですか? EC2でArch Linuxを実行していて、cgroups(cgmanagerを含む)が利用可能ですが、使用していません。

7
Caleb

まず第一に、ウェブでの検索で出てくるもののほとんどは廃止されています。たとえば、cgmanagerは新しいsystemdバージョンではサポートされなくなりました。この仕事のためにcuplimitNicecgsetまたはその他のツールを使用する限り、Webサーチで出てくるものの99%をフォローしないでください。 (独自の階層を作成することを期待するcgroup管理ツールの場合のように)アドバタイズされたとおりにまったく機能しないか、多数のハックに頼らずに仕事を完了しません( 'を使用する場合のようにプロセスのグループ全体を管理するための素晴らしいレベル)。

良い知らせは、これらの非推奨とともに(そして伝統的な すべてを食い尽くすタコモンスター)を追求することmodus operandisystemdの)aデフォルトの設定はシステム上のすべてに適用されており、systemdサービス用に微調整するのは簡単です。制限するサービスにオーバーレイ構成を追加するだけです。

$ Sudo systemctl edit <servicename>

オーバーライドする リソース制御値 を含むセクションを追加します。私の場合、これを思いつきました:

[Service]
CPUWeight=20
CPUQuota=85%
IOWeight=20
MemorySwapMax=0

これらの値はすべてが必要なわけではありませんが、最初の2つは質問に答えます。

  • CPUWeightのデフォルトは、システム上のすべてのプロセスで100です。低い値を設定しても、他のタスクに対してシステムの応答性を効果的に維持し、結果をあまり低下させない限り、プロセスはCPUを使用できます。これは任意の重みの整数です。
  • CPUQuotaは、他に何も実行されていない場合でも、許可されるCPU時間の絶対制限です。これはパーセント値です。私の場合、リソースを浪費する問題を修正するためにこれを設定する必要は本当にありませんでした。とにかくたくさんのCIジョブが山積みになるときにCPU温度を低く保つためにそれを設定することになりました。
  • IOWeightCPUWeightとほとんど同じです。この場合、システムタスク用にディスクを空けておき、何も起こらない場合にのみCIジョブでディスクをビジー状態に保つために使用されます。
  • MemorySwapMaxも質問の対象外です。私の場合、いくつかのCIジョブで実行されているレイトラバー(povray)が30以上のギグを使用すると考えているため、追加しましたRAMの30以上のギグに加えてスワップの数は、そこにあるからというだけで良い考えです。まったく使用させないほうが高速に実行されます。これはおそらくpovrayでより適切に構成されたものですが、この方法では、CIジョブ内で発生することを監視する必要がなく、システムスワップを無効にする必要もありません。

最後に、これらの値は、systemctl daemon-reloadを実行することにより、サービスを再起動することなく、オンザフライで変更できます。これは、変更の影響をすぐに確認するのに非常に便利です。

11
Caleb