RAMの使用量を制限するユーザーを作成するには?

RAMの使用量を制限するユーザーを作成するには?

だから、4GBのRAM + 4GBのスワップスペースがあります。限られたRAMとスワップスペース(3GBのRAMと1GBのスワップスペース)を持つユーザーを作成したいと思います。そのようなことは可能ですか?限られたRAMでアプリケーションを起動し、別のユーザーを作成せずに(特別なアプリケーションをインストールせずにデフォルトのDebian / CentOSサーバー構成を使用し、sudoを使用せずに)交換できますか?

修正する:

だから端末を開いて入力します。限界値コマンド:制限ulimit -v 1000000に似ています976,6Mb。次に、電話をかけてulimit -a制限が「オン」になっていることを知りました。その後、いくつかのbashスクリプトを実行してアプリケーションをコンパイルして起動しましたnohupチャンギ nohup ./cloud-updater-linux.sh >& /dev/null &...しかし時間が経つと、次のような結果が出ます。

ここに画像の説明を入力してください。

(制限が適用されない場合は問題ありません。大きなライブラリをダウンロードしてコンパイルを開始します。)

しかし、シェルに制限を適用し、すべてのプロセスがそれを使い始めたと思いますかulimit -v 1000000?私は何が間違っていましたか?端末と端末で始まるすべての子プロセスのメモリ使用量をどのように制限できますか?

答え1

ulimitまさにこれのためです。ulimitユーザーごとまたはグループごとにデフォルト値を設定できます。

/etc/security/limits.conf

ulimit -v KBYTES最大仮想メモリサイズを設定します。最大交換金額を提供することはできないようです。これは、単にユーザーが使用できる仮想メモリ量の制限です。

したがって、limits.conf次の行があります(最大4Gメモリ)。

luser  hard  as   4000000

アップデート - CGroups

ulimit課される制限はlimits.confプロセスごとに適用されます。私はこの点について全く不明です。

ユーザーが使用するメモリの合計量を制限したい場合(必要な事項)、使用したいcgroup

存在する/etc/cgconfig.conf

group memlimit {
    memory {
        memory.limit_in_bytes = 4294967296;
    }
}

cgroupこれにより、最大メモリ制限が4GiBのメモリが作成されます。

存在する/etc/cgrules.conf

luser   memory   memlimit/

これにより、実行中のすべてのプロセスがluserで作成されたcgroup内で実行されます。memlimitcgconfig.conf

答え2

cgroups他の答えで指摘したように、これは正しい方法です。残念ながら、この問題に対する完璧な解決策はありません。これについては以下で説明します。 cgroup メモリ使用量の制限を設定する方法はいくつかあります。ユーザーのログインセッションを自動的にcgroupの一部にする方法は、システムによって異なります。 赤い帽子いくつかのツールがありますシステム

memory.memsw.limit_in_bytesそして、memory.limit_in_bytesスワップを含めるか除外する制限を別々に設定します。欠点は、memory.limit_in_bytesそのグループのクォータに対してcgroupのプロセスに代わってカーネルがキャッシュしたファイルを計算することです。キャッシュが少ないということは、より多くのディスクアクセスを意味するため、システムに空きメモリがある場合は、一部のパフォーマンスを放棄できます。

一方、memory.soft_limit_in_bytescgroupはクォータを超えることができますが、カーネルOOM出口が呼び出されると、クォータを超えたcgroupは最初に論理的にシャットダウンされます。しかし、この方法の欠点は、いくつかのケースではいくつかのメモリをすぐに使用する必要があり、OOMキラーが終了するプロセスを見つける時間がないことです。この場合、クォータを超えたユーザープロセスが終了する前に、これが発生する可能性があります。間違っています。

ulimitしかし、これは間違いなく間違ったツールです。 ulimit は仮想メモリ使用量に制限がありますが、これはほぼ確実に望ましくありません。多くの物理アプリケーションは、物理メモリよりもはるかに多くの仮想メモリを使用します。ほとんどのガベージコレクションランタイム(Java、Go)は、断片化を防ぐためにこのように動作します。単純なC "hello world"プログラムをアドレスクリーナーにコンパイルすると、20TBの仮想メモリを使用できます。独立アロケータsbrk、例:ジャマルロック(これはRustのデフォルトアロケータです)またはtcmallocまた、仮想メモリ使用量が実際の使用量を大幅に超えてしまいます。効率を向上させるために、多くのツールはファイルをマッピングして仮想使用量を増やしますが、必ずしも物理使用量を増やすわけではありません。私のすべてのChromeプロセスは2TBの仮想メモリを使用しています。私のラップトップの物理メモリは8GBです。ここで仮想メモリクォータを設定しようとすると、Chromeがクラッシュしたり、Chromeが大量の仮想メモリ割り当て(使用しない)に依存する一部のセキュリティ機能を無効にしたり、ユーザーのシステム乱用を防ぐことにまったく影響しなくなります。

答え3

ユーザーレベルでメモリ使用量を制限することはできません。 ulimitはこれを実行できますが、単一のプロセスでのみ可能です。

ユーザーごとに制限があっても、/etc/security/limits.confユーザーは複数のプロセスを実行してすべてのメモリを使用できます。

本当にリソースを制限するには、リソース管理ツールを使用する必要があります。ラパードSolaris のプロジェクトおよびゾーンで使用されます。

同様の機能を提供しているように見えるLinuxで何かを見ることもできます。cgroup

答え4

私が使用しているUbuntu 22.04などのsystemdシステムでCPU /メモリを制限する最も簡単な方法は、cgroups systemd設定ファイルを使用することです(例:4GB RAMと2スレッドに制限)。

nano /etc/systemd/system/user-.slice.d/50-memory.conf

そのファイルに以下を作成します。

[Slice]
MemoryMax=4G
CPUQuota=200%

(その後systemctl daemon-reload申し込みに走ります)

これはすべてのユーザーに適用されますが、個々のユーザーを上書きできます。/etc/systemd/system/user-[uid].slice.d/50-memory.conf

(confファイルの名前は重要ではないと思いますが、よくわかりません)

関連情報