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


44

そのため、4 GB RAM + 4 GBスワップがあります。RAMとスワップが制限されたユーザーを作成したい:3 GB RAMと1 GBスワップ。そのようなことは可能ですか?RAMを制限してアプリケーションを起動し、別のユーザーを作成せずに利用可能なスワップを実行することは可能ですか(特別なアプリをインストールせず、デフォルトのDebian / CentOSサーバー構成のみを使用し、sudoを使用しないでください)?

更新:

そこで、terminallを開いてulimitコマンドを入力しました。ulimit -v 1000000これは976,6Mb制限のようなものです。次に、私は電話ulimit -aし、制限が「​​オン」であることを確認しました。その後nohup長い アプリでコンパイルして起動するbashスクリプトを開始しましたnohup ./cloud-updater-linux.sh >& /dev/null &...

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

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

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


1
ユーザー全体にメモリ制限を設定することはできず、各プロセスにのみ設定できます。また、RAMとスワップの使用を区別できません。より細かく制御したい場合は、仮想マシンでユーザーのプロセスを実行します。
ジル「SO-悪であるのをやめる」

@Gillesかなり確信して仮想マシンがちょうどでのcgroupと名前空間、またはその誘導体を使用すること
RapidWebs

@RapidWebsいいえ、そうではありません。事前定義された量のRAMをエミュレートするだけで、ゲストOSはそれをプロセスに割り当てる方法を決定します。
ルスラン

コンテナ(仮想マシンではない)はcgroupを使用して、メモリ使用量を制限します。仮想メモリを制限することはお勧めできません。プロセスは多くの仮想メモリを使用できますが、使用できるRAMはわずかです。たとえば、私のシステムには34359738367 kBの仮想メモリが割り当てられていますが、RAMははるかに少なくなっています。
ctrl-alt-delor

回答:


64

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

/etc/security/limits.conf

ulimit -v KBYTES仮想メモリの最大サイズを設定します。最大量のスワップを提供できるとは思わない。ユーザーが使用できる仮想メモリの量の制限にすぎません。

だからあなたlimits.confはラインを持っているでしょう(4Gメモリの最大)

luser  hard  as   4000000

更新-CGroups

制限はによって課さulimitlimits.confプロセスごとです。私はその点に関して明確ではありませんでした。

ユーザーが使用するメモリの総量を制限したい場合(これはあなたが尋ねたことです)。cgroupsを使用します。

/etc/cgconfig.conf

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

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

/etc/cgrules.conf

luser   memory   memlimit/

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


そのようなものは設定可能useraddですか?
myWallJSON

4
@myWallJSON直接ではありませんが、すぐにlimits.confに追加するか、limits.confで特定の制限を持つグループを設定して、そのグループにユーザーを追加できます。
ユートピアバインド

1
すごい!これができるとは知りませんでした!素晴らしい答え+1
ヤニックジルアード

1
@utopiabound:ulimitを使用しようとしたデータでQを更新しました。
myWallJSON

1
@ f.ardelianカーネルをアップグレードします。これを行う方法についての記事を次に示します。
ダニエルC.ソブラル

4

ユーザーレベルでメモリ使用量を制限することはできません。ulimitは1つのプロセスに対してのみ使用できます。

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

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

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


さて、すべてのプロセスがそのシェルから継承するため、ユーザーログインシェルまたはそのような何かに上限を設定すると、「ユーザーの制限を設定する」と解釈できると思いますか?
amn

1
@amnそれはしません。ユーザーは、このような制限を回避するために、新しいログインシェルを開くだけです。
jlliagre

そうです、それは私の仮定を無事に無効にします。
16

3

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

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の仮想メモリを使用できます。jemalloc(Rustのデフォルトのアロケーター)やtcmallocsbrkなど、依存しないアロケーター、物理使用量を大幅に超える仮想メモリ使用量もあります。効率のために、多くのツールはファイルをmmapします。これにより、仮想使用量が増加しますが、必ずしも物理使用量は増加しません。私のすべてのChromeプロセスは、それぞれ2TBの仮想メモリを使用しています。8GBの物理メモリを搭載したラップトップを使用しています。ここで仮想メモリクォータを設定しようとすると、Chromeが破損するか、Chromeに大量の仮想メモリの割り当てに依存する(ただし使用しない)セキュリティ機能を無効にするか、ユーザーによるシステムの不正使用を完全に無効にすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.