したがって、4 GB RAM + 4GB swapです。ramとswapを制限してユーザーを作成したいと思います。3GB RAMと1 GBのスワップです。限られたRAM=でアプリケーションを起動し、別のユーザーを作成せずに特別なアプリをインストールせずに、それらを利用可能にスワップすることができます-デフォルトのDebian/CentOSサーバー構成だけを持ち、 Sudoを使用しない)?
更新:
それで、私はterminallを開いて入力しました limit コマンド:ulimit -v 1000000
これは976,6Mb
制限のようになります。次にulimit -a
を呼び出し、制限が「オン」になっているのを確認しました。次に、Nohup
でアプリをコンパイルして起動するbashスクリプトを開始しました long oneNohup ./cloud-updater-linux.sh >& /dev/null &
...しばらくしてから、
(制限が適用されていなくても問題ありません。大きなlibをダウンロードし、コンパイルを開始しました。)
しかし、ulimit -v 1000000
を使用してシェルとそれから起動されるすべてのプロセスに制限を適用すると思いました。何が悪かったのですか?端末とそれが起動するすべてのサブプロセスをRAMの使用に制限する方法は?
ulimit
これのために作成されます。 ulimit
のデフォルトは、ユーザーごとまたはグループごとに設定できます。
/etc/security/limits.conf
ulimit -v KBYTES
は、最大仮想メモリサイズを設定します。最大のスワップを与えることはできないと思います。これは、ユーザーが使用できる仮想メモリの量の制限にすぎません。
そのため、あなたはlimits.conf
に(最大で4G
のメモリまで)行があります
luser hard as 4000000
UPDATE-CGroups
ulimit
およびlimits.conf
によって課される制限はプロセスごとです。その点についてははっきりしていませんでした。
ユーザーが使用するメモリの総量を制限したい場合(これはあなたが尋ねたものです)。 cgroups を使用します。
/etc/cgconfig.conf
:
group memlimit {
memory {
memory.limit_in_bytes = 4294967296;
}
}
これにより、最大メモリ制限が4GiBのcgroup
が作成されます。
/etc/cgrules.conf
:
luser memory memlimit/
これにより、luser
によって実行されるすべてのプロセスが、cgconfig.conf
で作成されたmemlimit
cgroups内で実行されます。
他の回答が指摘しているように、cgroups
はこれを行う正しい方法です。残念ながら、以下で説明するように、問題に対する完全な解決策はありません。 cgroupのメモリ使用制限を設定するには、さまざまな方法があります。ユーザーのログインセッションをcgroupに自動的に参加させる方法は、システムによって異なります。 Red Hat にはいくつかのツールがあり、 systemd にもあります。
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の仮想メモリを使用できます。 jemalloc (Rustのデフォルトのアロケータ)や tcmalloc など、sbrk
に依存しないアロケータも、実質的に仮想メモリを使用します。物理的な使用量の超過。効率を上げるために、多くのツールはファイルをmmapします。これにより、仮想の使用量が増加しますが、必ずしも物理的な使用量は増加しません。すべてのChromeプロセスはそれぞれ2TBの仮想メモリを使用しています。私は8GBの物理メモリを搭載したラップトップを使用しています。ここで仮想メモリクォータを設定しようとすると、Chromeが破損するか、 force Chromeは、大量の仮想メモリの割り当て(ただし使用しない)に依存するセキュリティ機能を無効にするか、ユーザーがシステムを悪用するのを防ぐのにまったく効果がありません。