web-dev-qa-db-ja.com

RAM使用量が制限されたユーザーを作成する方法は?

したがって、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 &...しばらくしてから、

enter image description here

(制限が適用されていなくても問題ありません。大きなlibをダウンロードし、コンパイルを開始しました。)

しかし、ulimit -v 1000000を使用してシェルとそれから起動されるすべてのプロセスに制限を適用すると思いました。何が悪かったのですか?端末とそれが起動するすべてのサブプロセスをRAMの使用に制限する方法は?

48
myWallJSON

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内で実行されます。

67
utopiabound

他の回答が指摘しているように、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は、大量の仮想メモリの割り当て(ただし使用しない)に依存するセキュリティ機能を無効にするか、ユーザーがシステムを悪用するのを防ぐのにまったく効果がありません。

5
Adam Azarchs

ユーザーレベルでメモリ使用量を制限することはできません。ulimitはそれを行うことができますが、単一のプロセスに対してです。

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

本当にリソースを制限したい場合は、Solarisのプロジェクトやゾーンで使用される rcapd などのリソース管理ツールを使用する必要があります。

Linuxで同様の機能を提供していると思われるものがあります。 cgroups です。

4
jlliagre