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

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

私はこれに関する質問を読むのに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(スワップファイルは持っていない)を使用していることがわかります。 ! ?私はこれがうまくulimit -mいかないことを読んだ。人々はulimit -vプロセスの仮想メモリ制限を設定するために使用されます。この仮想メモリはVSZにリストされていますかps?このプロセスを最大100 MBのシステムメモリのみを使用するように制限するには、どの値を設定する必要がありますか?ドキュメントを読ん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パラメータが仮想メモリサイズを設定していることが示されています。真実は何ですか?

答え1

はい、VSZは仮想メモリです。 RLIMIT_ASの場合、上記の引用句をどこで見つけましたか? setrlimit(2) は Linux システムコールなので、これがライブラリ関数 malloc(3) を監視する方法を理解できません。代わりに、brk(2)、sbrk(2)、およびmmap(2)でのみ使用できます。これは、そのマンページ(Scientific Linuxチェック)で提案されているものでもあります。ただし、これらの機能によって要求された合計メモリ量は、はい仮想メモリなので、RLIMIT_AS は仮想メモリを制限します。 (これも setrlimit(2) マンページと一致します。)

残念ながら、LinuxではRSSを制限することはできません(そうなるでしょうulimit -m)。 (RLIMIT_DATA)を試すことができますが、ulimit -dこれにはLinux 4.7以降のmmap(2)のみが含まれ、通常は大規模な割り当てに使用されます。もう一つの可能​​性は仮想メモリを制限することですが、RSSとVSZの違いが大きすぎるため、これは難しいかもしれません。

答え2

多くのプロセスが他のプロセスといくつかのメモリを共有します。たとえば、libc はほとんどすべてのプロセスで使用されますが、メモリに一度だけマッピングされますが、各プロセスの仮想メモリ使用量に含まれます。 cgroupを使用すると、特定のプロセス(主にRSS)によってのみメモリ使用量を制限できます。回答を見るプロセスとそのサブプロセスの合計リソース(メモリ)を制限する方法どうすればいいですか?これにより、プロセスとその子孫のメモリ全体が制限されます。

関連情報