UbuntuでCgroupsを使用してプロセスのCPUとRAMの使用を制限する方法
Ubuntuでsystemd cgroupsを使用して、コマンドまたはサービスのCPU時間とメモリ使用量を制限します。一時的なスコープ、永続的な制限、および重要なトレードオフを比較してください。
Ubuntu では、cgroups を使用してワークロードを制限する最も安全な一般的な方法は、systemd にコントロール グループの作成と管理を任せることです。systemd-run今すぐ起動するコマンドに使用するか、再起動後も制限を維持する必要がある場合は systemd サービスを構成します。CPUCPUQuota=時間の上限を厳密に設定し、MemoryHigh=負荷の場合は 、MemoryMax=メモリの上限の場合は から選択します。これらの制限は、ユニットとその子プロセスの両方に適用されます。
cgroup(コントロールグループ)は、Linuxカーネルのメカニズムであり、システムがプロセスのリソース使用量を把握し制御できるようにプロセスを整理します。Ubuntuのsystemdは既にサービスをcgroupに配置するため、ほとんどのユーザーは/sys/fs/cgroup手動でディレクトリを作成する必要はありません。以下の例ではsystemdのリソース制御インターフェースを使用しているため、ご使用のUbuntuリリースにインストールされているsystemdのバージョンに合わせて確認してください。

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

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コントローラがサポートしていない場合、リソース設定が拒否されることがあります。
のようなサービスの場合worker.service、ベンダーユニットファイルを編集する代わりにドロップインを作成します。 を実行しsudo systemctl edit worker.serviceて以下を追加します。

[Service]
CPUQuota=50%
MemoryHigh=700M
MemoryMax=900M
ドロップインを保存し、systemdのユニット定義を再読み込みしてサービスを再起動すると、プロセスは改訂されたポリシーの下で開始されます。
sudo systemctl daemon-reload
sudo systemctl restart worker.service
メモリ上限は慎重に設定してください。サービスがメモリを十分に解放できない場合MemoryMax、カーネルはcgroup内のメモリ不足キラーを起動する可能性があります。これにより、サービスグループ内の1つ以上のプロセスが終了し、作業が中断される可能性があります。より安全な方法は、メモリのMemoryHigh解放とスロットリングが許容できるレベルに設定し、MemoryMax最終的な境界としてより高い値を設定することです。厳しい上限を設定する前に、現実的なピーク負荷でテストしてください。
過渡現象スコープについては、指定したユニット名を使用してステータスを確認してください。

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 が管理するディレクトリに書き込まないでください。
CPUQuota=。値を小さくするとCPU使用率のピークは下がりますが、処理速度が遅くなり、キュー時間が長くなる可能性があります。CPUWeight=。ウェイトは競合状況に応じてCPUを相対的に割り当てます。固定の割合を確保したり、アイドル状態のCPUの使用を妨げたりすることはありません。MemoryHigh=メインの負荷しきい値として設定し、レイテンシとメモリ解放の動作を観察してください。MemoryMax=。境界が守れなくなった場合、メモリ不足(OOM)が発生する可能性があることを覚悟しておいてください。すべてのワークロードに対して理想的な制限値は存在しません。デスクトップのバッチジョブであれば、低いクォータと中程度のメモリ制限でも問題ないかもしれませんが、レイテンシに敏感なサービスでは、CPUMemoryHighリソースの解放に伴う一時停止を避けるために、より多くのCPUヘッドルームと高いクォータが必要になる場合があります。まずは控えめな設定から始め、代表的なピーク時にユニットを監視し、一度に1つの設定ずつ調整してください。
Ubuntuでsystemd cgroupsを使用して、コマンドまたはサービスのCPU時間とメモリ使用量を制限します。一時的なスコープ、永続的な制限、および重要なトレードオフを比較してください。
言語サポートが利用可能になったら、Gooroom OSのメニューを英語に切り替えてください。GNOMEの設定手順、Debianのロケールフォールバック、およびトラブルシューティングのチェック手順に従ってください。
Ubuntuのapt-get lockエラーを修正する方法を学びましょう。アクティブなパッケージプロセスを確認し、安全に待機し、アップデートが中断された場合にのみdpkgを修復します。
Debian 12 上で mdadm を使用して 2 台のディスクによる RAID 1 データ アレイをセットアップします。ディスクの識別、安全なパーティション分割、ブート アセンブリの設定、ext4 フォーマット、マウントの確認を行います。
KontrolPackを使えば、ネットワーク内のコンピューターを簡単に制御できます。異なるオペレーティングシステムで稼働しているコンピューターを簡単に接続・管理できます。
繰り返しのタスクを自動で実行したいですか?手動でボタンを何度もクリックする代わりに、アプリケーションが
iDownloadeは、BBCのiPlayerサービスからDRMフリーのコンテンツをダウンロードできるクロスプ���ットフォームツールです。.mov形式の動画もダウンロードできます。
Outlook 2010の機能についてはこれまで詳細に取り上げてきましたが、2010年6月までにリリースされないため、Thunderbird 3について見ていきましょう。
たまには休憩も必要です。面白いゲームを探しているなら、Flight Gearを試してみてください。無料のマルチプラットフォームオープンソースゲームです。
MP3 Diagsは、音楽オーディオコレクションの問題を解決するための究極のツールです。mp3ファイルに適切なタグを付けたり、アルバムカバーアートを追加したり、VBRを修正したりできます。