Saya telah menghabiskan 2 jam membaca pertanyaan tentang masalah ini, dan masih ada beberapa kesalahpahaman.
Saya punya proses ini:
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
Ini menunjukkan penggunaan 19.3Mb
memori residen sistem (saya tidak punya file swap), sekitar 1.8%
seluruh 1GB
memori sistem. Ukuran virtual adalah 1.39GB
?!?. Saya telah membaca bahwa ulimit -m
itu tidak berhasil. Orang menggunakan ulimit -v
mis pengaturan memori virtual untuk proses. Apakah ini memori virtual yang terdaftar dengan VSZ ps
? Nilai apa yang harus saya tetapkan jika saya ingin membatasi proses ini untuk menggunakan 100MB
memori sistem paling banyak. Saya telah membaca dokumentasi untuk setrlimit
dan ini sepertinya sah:
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.
Tetapi pada versi lain dari dokumentasi RLIMIT_AS
parameter ini menetapkan ukuran memori virtual. Apa kebenarannya?
Jawaban:
Ya, VSZ adalah memori virtual. Mengenai RLIMIT_AS, di mana Anda menemukan paragraf yang dikutip di atas? Karena setrlimit (2) adalah panggilan sistem Linux, saya tidak melihat bagaimana ia bisa memonitor malloc (3), fungsi perpustakaan. Sebagai gantinya, ia hanya dapat bekerja dengan brk (2), sbrk (2), dan mmap (2) - ini juga yang disarankan oleh manualnya (diperiksa dari Scientific Linux). Namun, jumlah total memori yang diminta melalui fungsi-fungsi ini adalah memori virtual, jadi RLIMIT_AS memang membatasi memori virtual. (Ini, sekali lagi, sesuai dengan halaman setrlimit (2).)
Sayangnya, Anda tidak dapat membatasi RSS di Linux (ini mungkin
ulimit -m
). Anda dapat mencobaulimit -d
(RLIMIT_DATA), tetapi ini akan mengabaikan mmap (2), biasanya digunakan untuk alokasi besar. Kemungkinan lain adalah membatasi memori virtual, tetapi dengan perbedaan besar antara RSS dan VSZ, ini mungkin sulit.sumber
setrlimit
halaman manual.IEEE/The Open Group 2003 GETRLIMIT(3P)
Bagaimanaps
bisa menunjukkan kepada saya RSS, tetapi kernel tidak dapat memaksakan batasnya?ulimit -d
itu. Aplikasi ini ditulis oleh saya, dan saya tidak menggunakannyammap()
.Banyak proses berbagi sebagian memorinya dengan proses lain, misalnya libc digunakan oleh hampir setiap proses tetapi hanya dipetakan dalam memori satu kali, tetapi ia diperhitungkan dalam penggunaan memori virtual setiap proses. Membatasi penggunaan memori yang hanya digunakan oleh proses tertentu (kebanyakan RSS) dapat dilakukan dengan menggunakan cgroup. Lihat jawaban untuk Bagaimana membatasi total sumber daya (memori) dari suatu proses dan anak-anaknya untuk cara melakukannya. Ini akan membatasi memori total suatu proses dan anak-anaknya.
sumber