Jak zwiększyć maksymalną przestrzeń wymiany w Mac OS X?

14

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.plistale nie widzę w nim tajnego numeru. Strona dynamic_pagerpodrę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 -Sopcję 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.

Mark Adler
źródło
Wysłałem również to pytanie na apple.stackexchange.com, ale nie było tam żadnej odpowiedzi.
Mark Adler
1
Powodem, dla którego możesz mallocwię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.
ctrl-alt-delor
Nie rozumiem, dlaczego uważasz, że ust. 5 jest prawdziwy, nie wynika on z ust. 4 (chociaż zaczynasz od „tak”). Czy próbowałeś także dodać dużo swapów? (pytanie nie jest jasne, ale podejrzewam, że odpowiedź brzmi tak).
ctrl-alt-delor
@richard Tak, wiem dlaczego to 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.
Mark Adler
@richard Ponieważ wiadomość jądra mówi „low swap”. Jeśli chodzi o „dodawanie wielu swapów”, nie, nie zrobiłem tego, ponieważ nie wiem jak. To jest dokładnie to pytanie. Jak dodać przestrzeń wymiany? Oczywiście jądro dodaje przestrzeń wymiany automatycznie, ale tylko do pewnego limitu. Stąd rdzeń pytania: Jak zwiększyć limit przestrzeni wymiany jądra?
Mark Adler

Odpowiedzi:

4

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.

bez danych
źródło
2
Świetny pomysł! Miałem duże nadzieje. Niestety, zostali oni rzuceni na surowy brzeg rzeczywistości. Proces nadal był zabijany przez jądro z powodu dużej ilości zamiany, tak jak poprzednio (komunikat konsoli „low swap”), mimo że korzystał on z pliku, który utworzyłem jako pamięć wirtualną mmap().
Mark Adler
Przepraszamy, większość mojego doświadczenia dotyczy Linuksa. Ale może problemem jest to, że jądro nie opróżnia się z powrotem do pliku i zamiast tego trzyma go w pamięci RAM. Co jeśli okresowo dzwonisz, msync()aby to zmusić?
danych
0

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:

  1. Edytuj plik / etc / rc, znajdź cały komentarz w sekcji wymiany. dodaj linięmount -vat swap
    • oznacza zamontowanie wszystkich partycji wymiany w / etc / fstab
  2. biegać pdisk /dev/disk? -dump
    • „?” to numer dysku twojego dysku HD numer obok partycji wymiany
  3. Edytuj lub utwórz / etc / fstab (prawdopodobnie nie istnieje) dodaj linię jak /dev/disk?s?? none swap sw 0 0
    • ? jest twoim dyskiem.
    • ?? to numer partycji wymiany.
  4. restart.
Maksymalna moc
źródło