UbuntuでCgroupsを使用してプロセスのCPUとRAMの使用を制限する方法

Ubuntu では、cgroups を使用してワークロードを制限する最も安全な一般的な方法は、systemd にコントロール グループの作成と管理を任せることです。systemd-run今すぐ起動するコマンドに使用するか、再起動後も制限を維持する必要がある場合は systemd サービスを構成します。CPUCPUQuota=時間の上限を厳密に設定し、MemoryHigh=負荷の場合は 、MemoryMax=メモリの上限の場合は から選択します。これらの制限は、ユニットとその子プロセスの両方に適用されます。

cgroup(コントロールグループ)は、Linuxカーネルのメカニズムであり、システムがプロセスのリソース使用量を把握し制御できるようにプロセスを整理します。Ubuntuのsystemdは既にサービスをcgroupに配置するため、ほとんどのユーザーは/sys/fs/cgroup手動でディレクトリを作成する必要はありません。以下の例ではsystemdのリソース制御インターフェースを使用しているため、ご使用のUbuntuリリースにインストールされているsystemdのバージョンに合わせて確認してください。

リソース制限を設定する前にsystemdのバージョンとcgroup2fsのマウントタイプを確認するUbuntuスタイルのターミナルモックアップ
systemdとcgroup v2マウントを確認するための、ターミナル画面の模擬例です。表示されているバージョンと出力はあくまで例であり、テスト結果ではありません。

問題に合ったコントロールを選択してください。

方法それが制御するもの最適なフィット感主なトレードオフ
systemd-run過渡スコープ新規起動コマンドとその子孫コマンドのCPUクォータとメモリ制限ビルド、スクリプト、インポート、または1回限りのバッチジョブ適用範囲は一時的なものであり、ワークロードが終了すると適用も終了します。既に実行中の任意のプロセスには適用されません。
systemdサービス設定サービスのcgroupのリソース(子プロセスを含む)再起動後も同じ制限を維持する必要があるデーモンまたはアプリケーション新しい設定を適用するには、サービス構成の変更と、通常は再起動が必要です。
cgroup v2 ファイルを直接ダウンロードカーネルレベルのコントローラcpu.maxなどmemory.maxコンテナランタイム、委任されたcgroupマネージャ、または特殊な管理より手動的な操作が必要になります。Ubuntuの階層構造の多くはsystemdによって管理されており、systemdが管理するツリーへの書き込みは、systemdと競合したり、権限や委譲の問題で失敗したりする可能性があります。
niceまたはCPUWeight=グループが競合する場合の相対的なCPU優先度バックグラウンド処理の優先度を低く保ちつつ、アイドル状態のCPUを使用できるようにする。これはCPU使用率の上限を厳密に制限するものではなく、メモリ使用量も制限しません。

ほとんどの対話型Ubuntuマシンでは、一時的なスコープが最も迅速かつ容易に元に戻せる選択肢です。本番サービスの場合は、サービスユニットを使用してポリシーを文書化し、起動時に復元するようにしてください。cgroupファイルを直接使用するのは、委任された階層を意図的に管理する場合、またはコンテナ/ランタイムワークフローを構築する場合に限ってください。

制限を設定する前にUbuntuシステムを確認してください

まず、systemdが利用可能であること、およびcgroupファイルシステムが統合v2であるかどうかを確認してください。

systemctl --version
stat -fc %T /sys/fs/cgroup

2 番目のコマンドの結果は、cgroup2fs統合された cgroup v2 ファイルシステムを示しています。Ubuntu のリリースやカスタマイズされたシステムでは異なる場合があるため、すべてのマシンが同じ階層構造や systemd 機能を持っているとは限りません。最初のコマンドで現在の systemd バージョンを確認することもできます。cgroup マウントが v2 でない場合、リソースのプロパティやコントローラの動作が異なる可能性があります。設定をコピーする前に、インストールされているリリースの Ubuntu マニュアルページを参照してください。

ワークロードを測定してから値を選択してください。システムの他の部分のための余裕を残し、ユーザーサービスに設定された制限は、その親スライスに設定された制限にも影響されることに注意してください。子cgroupは、親cgroupが許可する以上のリソースを受け取ることはできません。

これから開始するコマンドを制限する

自分のユーザーセッションでコマンドを実行するには、`transient scope` を使用してコマンドを起動しますsystemd-run --user --scope。例:

Ubuntu風のターミナルを模擬した画面で、CPU使用率50%、メモリ使用量700MBと900MBのしきい値を設定したPythonワーカーを起動する。
CPUクォータ、メモリ負荷しきい値、およびハードメモリ上限を設定した、単発のsystemd-runコマンドのターミナル画面の模擬例。
systemd-run --user --scope --unit=worker-capped \
  -p CPUQuota=50% \
  -p MemoryHigh=700M \
  -p MemoryMax=900M \
  -- python3 /opt/worker.py

Python コマンドを、実際に実行する必要のあるプログラムに置き換えてください。この例では、cgroup の最大 CPU 帯域幅を 1 つの CPU の半分に相当し、メモリ負荷処理を 700 MiB 付近から開始し、ハードメモリの最大値を 900 MiB に設定します。メモリ値は systemd の 1024 を基本単位として使用します。クォータは100%最大で 1 つの CPU 分の時間を表します。200%利用可能な場合は最大で 2 つの CPU 分の時間を使用できます。これは、コンピュータのすべてのコアの割合を意味するものではありません。

このコマンドはスコープであるため、フォアグラウンドで実行されます。終了すると、一時的なユニットは消滅します。--userシステムマネージャを使用する予定があり、必要な権限を持っている場合にのみ削除してください。システム全体の一時的なユニットの場合は、適切なコマンドオプションを指定してコマンドを実行してsudoください。マネージャまたはcgroupコントローラがサポートしていない場合、リソース設定が拒否されることがあります。

永続的な systemd サービスに制限を設定する

のようなサービスの場合worker.service、ベンダーユニットファイルを編集する代わりにドロップインを作成します。 を実行しsudo systemctl edit worker.serviceて以下を追加します。

CPUQuota、MemoryHigh、およびMemoryMaxの設定を含むsystemdサービス構成のモックアップ
CPUとメモリを永続的に制御するsystemdサービスの設定例です。実際のサービス名と、ワークロードに適した値を使用してください。
[Service]
CPUQuota=50%
MemoryHigh=700M
MemoryMax=900M

ドロップインを保存し、systemdのユニット定義を再読み込みしてサービスを再起動すると、プロセスは改訂されたポリシーの下で開始されます。

sudo systemctl daemon-reload
sudo systemctl restart worker.service

メモリ上限は慎重に設定してください。サービスがメモリを十分に解放できない場合MemoryMax、カーネルはcgroup内のメモリ不足キラーを起動する可能性があります。これにより、サービスグル​​ープ内の1つ以上のプロセスが終了し、作業が中断される可能性があります。より安全な方法は、メモリのMemoryHigh解放とスロットリングが許容できるレベルに設定し、MemoryMax最終的な境界としてより高い値を設定することです。厳しい上限を設定する前に、現実的なピーク負荷でテストしてください。

ユニットを検証し、その動作を確認してください。

過渡現象スコープについては、指定したユニット名を使用してステータスを確認してください。

systemctl statusとsystemd-cgtopによる一時的なワークロード範囲の監視を示すターミナルのモックアップ
状態とcgroupモニターの表示例です。ここに示されているCPUとメモリの数値は、実際の実行時の測定値ではありません。
systemctl --user status worker-capped.scope
systemd-cgtop

システムサービスの場合は、--userステータスコマンドで省略します。ステータスビューでは、ユニットが存在しアクティブであることを確認し、systemd-cgtopコントロールグループごとのリソース使用状況をリアルタイムで表示します。構成済みのプロパティを確認するには、ユニットに直接クエリを実行します。例:

systemctl --user show worker-capped.scope \
  -p CPUQuotaPerSecUSec -p MemoryHigh -p MemoryMax

cgroup に報告されるメモリ量は、必ずしも個々のプロセスの常駐セット値と同じではありません。これはグループに割り当てられたメモリ量であり、ワークロードの子孫プロセスも含まれる可能性があります。監視は、ワークロードが時間とともにどのように変化するかを示す証拠として捉え、盲目的に最適化するための単一の数値として扱うべきではありません。

プロセスが既に実行中の場合はどうなりますか?

systemd-run新しいユニット内で新しいコマンドを開始します。既存の任意の PID を取得してそのスコープに移動することはありません。プロセスが systemd サービスに属している場合は、ドロップインを使用してそのサービスに設定を適用するか、一時的な変更の場合は を使用しますsudo systemctl set-property --runtime worker.service CPUQuota=50% MemoryHigh=700M MemoryMax=900M。この--runtime形式は一時的なものであり、永続的なサービス構成を置き換えるものではありません。

プロセスがデスクトップ セッション内の通常のプログラムである場合、安全で簡単な方法は、通常、それを停止して で再起動することですsystemd-run。ユーザー スライス全体など、より広いスライスにプロパティを適用すると、多くの無関係なアプリケーションに影響を与える可能性があります。PID を cgroup ファイルに書き込むことでプロセスを移動するには、関連する委任階層の制御が必要であり、cgroup v2 のプロセス配置ルールを遵守する必要があります。推測で systemd が管理するディレクトリに書き込まないでください。

CPUとメモリポリシーの選択方法

  • CPU使用率の上限を厳密に設定する必要がありますか?それなら、を選択してくださいCPUQuota=。値を小さくするとCPU使用率のピークは下がりますが、処理速度が遅くなり、キュー時間が長くなる可能性があります。
  • 優先度を低く設定したい場合、割り当て量ではなくウェイトを検討してくださいCPUWeight=。ウェイトは競合状況に応じてCPUを相対的に割り当てます。固定の割合を確保したり、アイドル状態のCPUの使用を妨げたりすることはありません。
  • 即座に強制停止することなくメモリ負荷をかけたいですか?MemoryHigh=メインの負荷しきい値として設定し、レイテンシとメモリ解放の動作を観察してください。
  • 最終的な境界が必要ですか?通常のピーク時に対応できる十分な余裕を持たせてくださいMemoryMax=。境界が守れなくなった場合、メモリ不足(OOM)が発生する可能性があることを覚悟しておいてください。
  • 既にコンテナを使用している場合は、コンテナマネージャがサポートするCPUおよびメモリフラグを優先してください。これらのフラグは、そのコンテナのcgroupを設定し、ライフサイクルに適合させます。

すべてのワークロードに対して理想的な制限値は存在しません。デスクトップのバッチジョブであれば、低いクォータと中程度のメモリ制限でも問題ないかもしれませんが、レイテンシに敏感なサービスでは、CPUMemoryHighリソースの解放に伴う一時停止を避けるために、より多くのCPUヘッドルームと高いクォータが必要になる場合があります。まずは控えめな設定から始め、代表的なピーク時にユニットを監視し、一度に1つの設定ずつ調整してください。

参考文献

コメントを残す

UbuntuでCgroupsを使用してプロセスのCPUとRAMの使用を制限する方法

UbuntuでCgroupsを使用してプロセスのCPUとRAMの使用を制限する方法

Ubuntuでsystemd cgroupsを使用して、コマンドまたはサービスのCPU時間とメモリ使用量を制限します。一時的なスコープ、永続的な制限、および重要なトレードオフを比較してください。

Gooroom OSのUI要素を英語に翻訳する方法

Gooroom OSのUI要素を英語に翻訳する方法

言語サポートが利用可能になったら、Gooroom OSのメニューを英語に切り替えてください。GNOMEの設定手順、Debianのロケールフォールバック、およびトラブルシューティングのチェック手順に従ってください。

Ubuntuでapt-Get Lockがロック/var/lib/dpkg/lock-frontendを取得できない問題を修正

Ubuntuでapt-Get Lockがロック/var/lib/dpkg/lock-frontendを取得できない問題を修正

Ubuntuのapt-get lockエラーを修正する方法を学びましょう。アクティブなパッケージプロセスを確認し、安全に待機し、アップデートが中断された場合にのみdpkgを修復します。

Debian 12でコマンドラインからRAID 1アレイを構成する方法

Debian 12でコマンドラインからRAID 1アレイを構成する方法

Debian 12 上で mdadm を使用して 2 台のディスクによる RAID 1 データ アレイをセットアップします。ディスクの識別、安全なパーティション分割、ブート アセンブリの設定、ext4 フォーマット、マウントの確認を行います。

KontrolPackでネットワーク経由でコンピュータを接続/制御

KontrolPackでネットワーク経由でコンピュータを接続/制御

KontrolPackを使えば、ネットワーク内のコンピューターを簡単に制御できます。異なるオペレーティングシステムで稼働しているコンピューターを簡単に接続・管理できます。

Actionazでキーボードとマウスのクリックをエミュレートする

Actionazでキーボードとマウスのクリックをエミュレートする

繰り返しのタスクを自動で実行したいですか?手動でボタンを何度もクリックする代わりに、アプリケーションが

BBC iPlayerからiPhoneへのダウンローダー

BBC iPlayerからiPhoneへのダウンローダー

iDownloadeは、BBCのiPlayerサービスからDRMフリーのコンテンツをダウンロードできるクロスプ���ットフォームツールです。.mov形式の動画もダウンロードできます。

Thunderbird 3の嬉しい新機能14選

Thunderbird 3の嬉しい新機能14選

Outlook 2010の機能についてはこれまで詳細に取り上げてきましたが、2010年6月までにリリースされないため、Thunderbird 3について見ていきましょう。

FlightGear Flight Simulatorを無料でダウンロード[楽しもう]

FlightGear Flight Simulatorを無料でダウンロード[楽しもう]

たまには休憩も必要です。面白いゲームを探しているなら、Flight Gearを試してみてください。無料のマルチプラットフォームオープンソースゲームです。

MP3診断:MP3オーディオファイルの最大50の問題を修正

MP3診断:MP3オーディオファイルの最大50の問題を修正

MP3 Diagsは、音楽オーディオコレクションの問題を解決するための究極のツールです。mp3ファイルに適切なタグを付けたり、アルバムカバーアートを追加したり、VBRを修正したりできます。