プログラムの実行時にcgroupを使用してメモリを制限する

プログラムの実行時にcgroupを使用してメモリを制限する

cgroupを作成し、cgroupに200MBのメモリ制限を接続するとします。その後、cgroup内でメモリ集約的なプロセスを実行し、200MBの制限をすべて使用しました。

プロセスの実行中にプロセスのメモリ消費量を減らすことは可能ですか?では、プロセスがすでに実行されていて200MBを使用している場合は、100MBに制限を設定できますか?もしそうなら、カーネルはcgroupが使用している100MBのメモリをどれだけ早く解放し、プロセスがそのメモリにアクセスしようとするとどうなりますか?

ベストアンサー1

はい、「割り当て」の意味によって異なります。数量を減らすか増やすことができます物理プロセスに使用可能なメモリです。

使用しているメモリには次のものがあります。

  • プロセスにマップされたディスクイメージ(共有ライブラリ、実行ファイルなど)
  • IOキャッシュ層によってキャッシュされたディスクページ
  • 匿名メモリは、スワップでサポートされている場合とサポートされない場合があります。

cgroupを減らすと、memory.limit_in_bytesシステムはディスクキャッシュとディスクイメージ(実行ファイルなど)からページを削除します。必要に応じてこれらのページを常に再読み込みできるためです。

スワッピングが有効な場合は、匿名メモリを呼び出すこともできます。

プロセス用のcgroupを作成し、制限を設定します。

# Create a cgroup
mkdir /sys/fs/cgroup/memory/my_cgroup
# Add the process to it
echo $PID > /sys/fs/cgroup/memory/my_cgroup/cgroup.procs

# Set the limit to 40MB
echo $((40 * 1024 * 1024)) > /sys/fs/cgroup/memory/my_cgroup/memory.limit_in_bytes

システムは、限度未満になるまで直ちに交換し、プロセスを限度未満に保つために交換を続けます。

カーネルが最初にプロセスまたはグループを制限の下に置くことができない場合(一部のメモリをスワップできないため、たとえばスワップがない場合、または一部のカーネルページをスワップできない場合)、エラーが発生します。制限は変更されません。

後でこれを実行できない場合、OOMキラーはプロセス(またはその子プロセスの1つ)を終了します。

キーを使用してグループ内のプロセスを一時停止できますが、oom_control制限を増やすか、1つ以上のプロセスを終了して問題を直接解決する必要があります。

追加情報

鍵もありますmemory.soft_limit_in_bytes。これはoom Killerを呼び出しませんが、それを使用してシステムにメモリが不足している場合(そして他の場合でも)、最初に交換するプロセスを決定します。

プロセスまたはグループ内で

プロセスは、現在の使用量とハード制限とソフト制限を照会するようにエンコードして、メモリ制限を認識できます。その後、制限違反を防ぐための措置を講じることができます。たとえば、メモリ割り当て、サブプロセスの作成、新しい接続の許可、または既存の接続の終了などの使用量の削減などを実行できます。

プロセスはcgroups通知APIを使用して通知を購読できます。

また、見ることができます

カーネル文書は次の場所にあります。

おすすめ記事