Bagaimana cara membatasi penggunaan memori aplikasi?

10

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.3Mbmemori residen sistem (saya tidak punya file swap), sekitar 1.8%seluruh 1GBmemori sistem. Ukuran virtual adalah 1.39GB?!?. Saya telah membaca bahwa ulimit -mitu tidak berhasil. Orang menggunakan ulimit -vmis 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 100MBmemori sistem paling banyak. Saya telah membaca dokumentasi untuk setrlimitdan 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_ASparameter ini menetapkan ukuran memori virtual. Apa kebenarannya?

Dragomir Ivanov
sumber
Tolong, perhatikan pemformatan posting.
rozcietrzewiacz

Jawaban:

6

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 mencoba ulimit -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.

Ansgar Esztermann
sumber
Terima kasih atas jawaban Anda. Paragrafnya dari setrlimithalaman manual. IEEE/The Open Group 2003 GETRLIMIT(3P)Bagaimana psbisa menunjukkan kepada saya RSS, tetapi kernel tidak dapat memaksakan batasnya?
Dragomir Ivanov
6
Menurut Alan Cox, ini memiliki alasan historis: menghitung RSS dulu mahal, jadi menegakkan batas akan menempatkan beban besar pada kernel; sumber: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . Lihat juga stackoverflow.com/questions/3043709/…
Ansgar Esztermann
Saya melihat. Saya kira saya akan pergi dengan ulimit -ditu. Aplikasi ini ditulis oleh saya, dan saya tidak menggunakannya mmap().
Dragomir Ivanov
2
Tidak, Anda biasanya tidak (atau sbrk ()), tetapi malloc () mungkin.
Ansgar Esztermann
Saya melihat. Sangat disayangkan. Jadi solusi untuk pertanyaan ini adalah cgroups, atau polling penggunaan memori dengan beberapa bahasa skrip.
Dragomir Ivanov
3

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.

JanKanis
sumber