Spędziłem 2 godziny na czytaniu pytań na ten temat, ale nadal istnieje pewne nieporozumienie.
Mam ten proces:
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
To pokazuje, że wykorzystuje 19.3Mb
pamięć rezydentną systemu (nie mam pliku wymiany), wokół 1.8%
całej 1GB
pamięci systemowej. Rozmiar wirtualny to 1.39GB
?!?. Przeczytałem, że ulimit -m
to nie działa. Ludzie używają ulimit -v
np. Ustawienia wirtualnej pamięci dla procesu. Czy ta pamięć wirtualna jest wymieniona na liście VSZ ps
? Jaką wartość powinienem ustawić, jeśli chcę ograniczyć ten proces do użycia 100MB
maksymalnie pamięci systemowej. Przeczytałem dokumentację setrlimit
i wydaje się to uzasadnione:
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.
Ale w innych wersjach dokumentacji ten RLIMIT_AS
parametr określa rozmiar pamięci wirtualnej. Jaka jest prawda?
Odpowiedzi:
Tak, VSZ to pamięć wirtualna. Co do RLIMIT_AS, gdzie znalazłeś cytowany powyżej akapit? Ponieważ setrlimit (2) jest wywołaniem systemowym Linuksa, nie widzę, jak mógłby monitorować malloc (3), funkcję biblioteki. Zamiast tego może działać tylko z brk (2), sbrk (2) i mmap (2) - tak sugeruje również jego manpage (sprawdzone w Scientific Linux). Jednak całkowita ilość pamięci wymagana przez te funkcje to pamięć wirtualna, więc RLIMIT_AS rzeczywiście ogranicza pamięć wirtualną. (Jest to znowu zgodne ze stroną man setrlimit (2).)
Niestety nie można ograniczyć RSS pod Linuksem (byłoby to
ulimit -m
). Możesz spróbowaćulimit -d
(RLIMIT_DATA), ale to zignoruje mmap (2), zwykle używany do dużych alokacji. Inną możliwością byłoby ograniczenie pamięci wirtualnej, ale przy tak dużej różnicy między RSS a VSZ może to być trudne.źródło
setrlimit
strony manuala.IEEE/The Open Group 2003 GETRLIMIT(3P)
Jak tops
możliwe, że pokazuje mi RSS, ale jądro nie może narzucać ograniczeń?ulimit -d
wtedy. Aplikacja została napisana przeze mnie i nie korzystałemmmap()
.Wiele procesów współdzieli część pamięci z innymi procesami, np. Libc jest używany przez prawie każdy proces, ale mapowany w pamięci tylko raz, ale liczy się to do wykorzystania pamięci wirtualnej każdego procesu. Ograniczenie użycia pamięci, które jest używane tylko przez określony proces (głównie RSS), można wykonać za pomocą cgroups. Zobacz odpowiedzi na temat Ograniczania całkowitych zasobów (pamięci) procesu i jego dzieci, aby dowiedzieć się, jak to zrobić. Ograniczy to całkowitą pamięć procesu i jego dzieci.
źródło