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.
źródło
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 zwrotumalloc()
. Nawiasem mówiąc, moim celem nie jest wcześniejsze zawodzenie. Moim celem jest sukces.Odpowiedzi:
Nie jest to odpowiedź, o którą prosiłeś, ale jeśli utworzysz własny plik o odpowiednim rozmiarze, zmapuj go w swoim procesie, a następnie uruchom obliczenia w tej przestrzeni adresowej, powinien on mieć taki sam efekt jak plik wymiany i masz gwarancję, że mają miejsce, w przeciwieństwie do konkurowania z innymi procesami o dostępną pamięć RAM / swap.
Może być również wolniejszy, w zależności od częstotliwości nadpisywania danych, ale powinien być znacznie bardziej przenośny.
źródło
mmap()
.msync()
aby to zmusić?Moje informacje o komputerze Mac są dość datowane, może to już nie być magia jądra. Jako taki sugeruję użycie Linuksa dla tego programu, w którym możesz zamontować folder lub partycję jako swap w bardzo prosty sposób.
Wyeliminuj niepewność korzystania z dynamicznego folderu wymiany. Utwórz fizyczną partycję wymiany (tylko pustą niesformatowaną partycję z kodem typu tabeli dysków do wymiany, w systemie Linux jest to kod szesnastkowy
0x82
). Następnie:mount -vat swap
pdisk /dev/disk? -dump
/dev/disk?s?? none swap sw 0 0
źródło