W systemie Mac OS X Yosemite 10.10.5, gdy próbuję uruchomić obliczenia, które muszą przydzielić i użyć 128 GB pamięci (jest to program wiersza poleceń napisany w C), jądro zabija mój proces z najwyższą uprzedzeniem. Ten wpis dziennika konsoli jest przykładem jednego wystąpienia:
9/25/15 7: 08: 40.000 PM jądro [0]: low swap: killing pid 6202 (huffgrp)
Obliczenia działają poprawnie i w rozsądnym czasie, gdy przydziela i zużywa 64 GB pamięci. Mój komputer Mac ma 32 GB pamięci RAM i miejsce na beaucoup na dysku twardym. Próbowałem tego również na innym komputerze Mac z 8 GB pamięci RAM, na której obliczenie 64 GB działa również dobrze, oczywiście dłużej, ale obliczenie 128 GB zostaje zabite przez jądro w ten sam sposób.
Nawiasem mówiąc, malloc()
nigdy nie zwraca błędu, bez względu na to, o ile miejsca proszę. Jądro zabije proces tylko wtedy, gdy zbyt wiele pamięci zostanie faktycznie wykorzystane przez proces, co spowoduje wiele zamian na dysk twardy.
Wygląda więc na to, że istnieje sekretny limit przestrzeni wymiany pomiędzy 64 GB a 128 GB.
Moje pytanie brzmi: jak zmienić konfigurację jądra, aby umożliwić więcej przestrzeni wymiany? Znalazłem obiecujący plik, /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
ale nie widzę w nim tajnego numeru. Strona dynamic_pager
podręcznika man mówi, że wszystko, co robi, to ustawianie nazwy i lokalizacji plików wymiany. Istnieje starsza wersja tej samej strony podręcznika man, która dokumentuje -S
opcję ustawienia rozmiaru utworzonych plików wymiany. Próbowałem tego, prosząc o pliki wymiany 160 GB, ale nie przyniosło to efektu. Pliki wymiany wciąż miały po 1 GB, a proces nadal był zabijany przez jądro.
malloc
więcej niż masz, jest to, że commit_limit jest bardzo wysoki (prawdopodobnie nieskończony). Dlatego system operacyjny przydzieli pamięć, której nie ma (to zakład, że proces go nie wykorzysta, system operacyjny zwykle wygrywa ten zakład). Możesz dostosować limit zatwierdzeń do limitu pamięci, w ten sposób proces zakończy się niepowodzeniem wcześnie.
malloc()
robi. Odrzucałem ewentualne komentarze na temat kogoś, kto myśli, że nie sprawdzam wartości zwrotu malloc()
. Nawiasem mówiąc, moim celem nie jest wcześniejsze zawodzenie. Moim celem jest sukces.