Pracuję nad programem; czasami kończy się to przydzielaniem bardzo dużej ilości pamięci (>> 10G na maszynie z 8G pamięci fizycznej), co powoduje, że system przestaje odpowiadać. Chcę ograniczyć ilość pamięci, którą proces może przydzielić. Zwykle robiłbym to:
ulimit -m 4000000 ; ./myprogram
... co powinno zabić mój program, jeśli spróbuje użyć więcej niż 4 GB pamięci.
W OS X El Capitan wydaje się, że nie ma to żadnego wpływu; nawet ulimit -m 1
(ograniczenie wszystkich programów do zaledwie 1kB pamięci!) jest nieskuteczne.
Jak ustawić górną granicę pamięci dostępnej dla określonego procesu?
macos
el-capitan
command-line
memory
development
CPCALLEN
źródło
źródło
ulimit -m
nie działa już w systemie Linux (> 2.4.30), aleulimit -v
nadal działa zgodnie z oczekiwaniami. (Podobnie jakulimit -m
,ulimit -v
również wydaje się nie mieć wpływu na OS X.)Odpowiedzi:
Istnieją dwa podejścia do ograniczenia użycia pamięci: ex post facto i zapobiegawcze. To znaczy, możesz spróbować zabić swój program po tym, jak stał się zbyt duży, lub możesz tak zaprogramować, aby nie był zbyt duży.
Jeśli nalegasz na faktyczne podejście ex post, możesz użyć następującego skryptu Bash. Ten skrypt najpierw wyszukuje ilość pamięci (zgodnie z definicją „rezydentnego rozmiaru zestawu”), której używa proces z pid procesid, odfiltrowuje wszystkie dane nienumeryczne za pomocą grep i zapisuje tę ilość jako zmienną n. Skrypt sprawdza następnie, czy n jest większe od podanego x. Jeśli tak, proces z procid pid zostaje zabity.
Proszę zanotować:
<pid>
identyfikatorem procesu swojego programu.<x>
na rss = "resident set size" (tzn. Rzeczywisty rozmiar pamięci), którego program nie powinien przekraczać.n=$(ps -<pid> -o rss | grep '[0-9]') if [ $n -gt <x> ]; then kill -9 <pid>; fi
Jeśli chcesz, aby działało to co sekundę, po prostu umieść go w pętli i każ mu czekać y sekund po każdej iteracji. Możesz również napisać podobne polecenie za pomocą
top
. Twoim punktem wyjścia byłobytop -l 1|grep "<pid>"|awk '{print $10}'
.@ kenorb za odpowiedź pomógł mi z moim skrypcie
Chociaż uważam, że to odpowiada na pytanie, na dłuższą metę uważam, że lepszym rozwiązaniem programistycznym jest podejście zapobiegawcze z wykorzystaniem ręcznego przydzielania pamięci.
Po pierwsze, czy jesteś pewien, że użycie pamięci jest naprawdę problemem? GO dokumentacja stanowi:
Jeśli nadal uważasz, że masz problem, zachęcam do ręcznego zarządzania pamięcią, tak jak dzieje się to w języku programowania C. Ponieważ go jest napisane w C, podejrzewałem, że będą sposoby na zarządzanie pamięcią C / alokacje, i rzeczywiście są. Zobacz to repozytorium github, które:
Przypadek użycia podano jako:
To wydaje się lepszym rozwiązaniem długoterminowym.
Jeśli chcesz dowiedzieć się więcej o C (w tym o zarządzaniu pamięcią), język programowania C jest standardowym źródłem informacji.
źródło