アプリケーションのメモリ使用量を制限するには?


10

私はこの問題についての質問を2時間読んでいましたが、それでも誤解があります。

私はこのプロセスを持っています:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

これは19.3Mb、システムメモリ1.8%全体のシステム常駐メモリ(私はスワップファイルがない)の使用を示してい1GBます。仮想サイズは1.39GB?!?です。私はそれulimit -mが機能しないことを読んだ。人々は、ulimit -v例えばプロセスに仮想メモリを設定することを使用します。この仮想メモリはVSZがリストされているものpsですか?このプロセスが100MBシステムメモリを最大で使用するように制限する場合に設定する必要がある値。私はドキュメントを読みましたがsetrlimit、これは合法のようです:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

ただし、ドキュメントの他のバージョンでは、このRLIMIT_ASパラメーターは仮想メモリサイズを設定します。真実は何?


投稿のフォーマットに注意してください。
rozcietrzewiacz

回答:


6

はい、VSZは仮想メモリです。RLIMIT_ASに関して、上記で引用された段落はどこにありましたか?setrlimit(2)はLinuxシステムコールであるため、ライブラリ関数であるmalloc(3)をどのように監視できるかはわかりません。代わりに、これはbrk(2)、sbrk(2)、およびmmap(2)でのみ機能します-これは、そのマンページ(Scientific Linuxのチェック)が示唆するものでもあります。ただし、これらの関数を介して要求されるメモリの総量仮想メモリであるため、RLIMIT_ASは実際に仮想メモリを制限します。(これも、setrlimit(2)マンページに準拠しています。)

残念ながら、LinuxではRSSを制限できません(これはになりますulimit -m)。ulimit -d(RLIMIT_DATA)を試すことができますが、これは通常、大規模な割り当てに使用されるmmap(2)を無視します。もう1つの可能性は仮想メモリを制限することですが、RSSとVSZの間にこのような大きな違いがあるため、これは難しい場合があります。


お返事ありがとうございます。段落はsetrlimitmanページからです。IEEE/The Open Group 2003 GETRLIMIT(3P)どうしてpsRSSを表示できるのですか、カーネルは制限を強制できません。
Dragomir Ivanov

6
Alan Coxによると、これには歴史的な理由があります。RSSの計算は以前は高価だったため、制限を強制するとカーネルに大きな負荷がかかります。ソース:linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.htmlstackoverflow.com/questions/3043709/…
Ansgar Esztermann

そうですか。私はその時に行くと思いulimit -dます。アプリケーションは私が作成したもので、私は使用しませんでしたmmap()
Dragomir Ivanov

2
いいえ、通常はしません(またはsbrk())はしませんが、malloc()は可能性があります。
アンスガーエステルマン

そうですか。それは非常に残念です。したがって、この質問の解決策は、cgroups、またはスクリプト言語を使用したメモリ使用量のポーリングのいずれかです。
Dragomir Ivanov

3

多くのプロセスは他のプロセスとメモリの一部を共有します。たとえば、libcはほぼすべてのプロセスで使用されますが、メモリにマップされるのは1回だけですが、すべてのプロセスの仮想メモリ使用量にカウントされます。特定のプロセス(主にRSS)でのみ使用されるメモリ使用量を制限するには、cgroupsを使用します。方法については、プロセスとその子のリソース(メモリ)の合計を制限する方法の回答を参照してください。これにより、プロセスとその子の合計メモリが制限されます。

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