だから、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内で実行されます。memlimit
cgconfig.conf
答え2
cgroups
他の答えで指摘したように、これは正しい方法です。残念ながら、この問題に対する完璧な解決策はありません。これについては以下で説明します。 cgroup メモリ使用量の制限を設定する方法はいくつかあります。ユーザーのログインセッションを自動的にcgroupの一部にする方法は、システムによって異なります。 赤い帽子いくつかのツールがありますシステム。
memory.memsw.limit_in_bytes
そして、memory.limit_in_bytes
スワップを含めるか除外する制限を別々に設定します。欠点は、memory.limit_in_bytes
そのグループのクォータに対してcgroupのプロセスに代わってカーネルがキャッシュしたファイルを計算することです。キャッシュが少ないということは、より多くのディスクアクセスを意味するため、システムに空きメモリがある場合は、一部のパフォーマンスを放棄できます。
一方、memory.soft_limit_in_bytes
cgroupはクォータを超えることができますが、カーネルOOM出口が呼び出されると、クォータを超えたcgroupは最初に論理的にシャットダウンされます。しかし、この方法の欠点は、いくつかのケースではいくつかのメモリをすぐに使用する必要があり、OOMキラーが終了するプロセスを見つける時間がないことです。この場合、クォータを超えたユーザープロセスが終了する前に、これが発生する可能性があります。間違っています。
ulimit
しかし、これは間違いなく間違ったツールです。 ulimit は仮想メモリ使用量に制限がありますが、これはほぼ確実に望ましくありません。多くの物理アプリケーションは、物理メモリよりもはるかに多くの仮想メモリを使用します。ほとんどのガベージコレクションランタイム(Java、Go)は、断片化を防ぐためにこのように動作します。単純なC "hello world"プログラムをアドレスクリーナーにコンパイルすると、20TBの仮想メモリを使用できます。独立アロケータsbrk
、例:ジャマルロック(これはRustのデフォルトアロケータです)またはtcmallocまた、仮想メモリ使用量が実際の使用量を大幅に超えてしまいます。効率を向上させるために、多くのツールはファイルをマッピングして仮想使用量を増やしますが、必ずしも物理使用量を増やすわけではありません。私のすべてのChromeプロセスは2TBの仮想メモリを使用しています。私のラップトップの物理メモリは8GBです。ここで仮想メモリクォータを設定しようとすると、Chromeがクラッシュしたり、Chromeが大量の仮想メモリ割り当て(使用しない)に依存する一部のセキュリティ機能を無効にしたり、ユーザーのシステム乱用を防ぐことにまったく影響しなくなります。
答え3
答え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ファイルの名前は重要ではないと思いますが、よくわかりません)