私はこれに関する質問を読むのに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)によってのみメモリ使用量を制限できます。回答を見るプロセスとそのサブプロセスの合計リソース(メモリ)を制限する方法どうすればいいですか?これにより、プロセスとその子孫のメモリ全体が制限されます。