Sytuacja: napraw Out of Memory
błędy w Matlab Ubuntu
Cel: przydzielić trochę pamięci wirtualnej i / lub Zamień na zewnętrzny HDD / SSD; spadek odczytu / zapisu z 20 GBps do 0,1 GBps, co jest w porządku!
Terminologia: zamień i pamięć wirtualna tutaj
Nie, swap i pamięć wirtualna są zupełnie inne. Na przykład mapowanie pamięci pliku 1 GB wymaga dodatkowego 1 GB pamięci wirtualnej, ale nie ma zmian w korzystaniu z wymiany. Swap to forma sklepu z zapleczem. Wiele zastosowań pamięci wirtualnej nie ma nic wspólnego ze sklepem z zapleczem. (I były systemy z pamięcią wirtualną i bez wymiany, a także systemy z wymianą, ale bez pamięci wirtualnej.)
Sprzęt konsumencki jest ograniczony, dlatego muszę używać więcej pamięci wirtualnej i / lub wymieniać z zewnętrznymi dyskami twardymi. Matlab mówi o pamięci wymiany (TODO z wyłączeniem pamięci wirtualnej?)
Systemy Linux - zmień przestrzeń wymiany za pomocą poleceń
mkswap
iswapon
.
Charakterystyka systemu
Możesz zobaczyć, ile masz
swapon -s
Filename Type Size Used Priority /dev/sda3 partition 8326140 0 -1
Konfiguracje Matlaba
% /programming//a/35971040/54964 com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB % TODO cannot find ways how to put Matlab use /dev/sda3
Widzisz więc, że mój Matlab go nie używa. Otrzymuję
Out of Memory
błędy z dużymi matrycami w Matlabie. Nie udało mi się wprowadzićreshape
macierzy do wektorów i napisać kodu równoległego. Chcę więc używać pamięci wirtualnej, ponieważ muszę wykonać pracę; stawka nie ma znaczenia.
Pseudo kod
- Skrypt powłoki, który tworzy swap, uruchamia MATLAB i usuwa go po wyjściu z MATLAB. ( MichaelHooreman )
- Włącz wymianę na zewnętrznym dysku twardym. Jak korzystać
sudo swapon -a
tutaj? - Uruchom Matlab.
- Umieść Matlaba użyj zamiany.
- Usuń wymianę po wyjściu Matlaba.
Tymczasowa zamiana, uruchamianie klienta oraz zamykanie / usuwanie zamiany w skrypcie Micheala
Sytuacja : nie można kontrolować błędów podczas konfigurowania środowiska (1), uruchamiania Matlaba (2) i zamykania środowiska (3)
Skrypt
#!/usr/bin/env bash
# /programming//a/69808/54964
set -e
# TODO How to do swapoff if any error?
SWAP_FILE="/media/masi/SamiSwapVirtual/.swap_file_20.7.2016"
SIZE_MB=16000
TO_RUN="matlab"
dd if="/dev/zero" of=${SWAP_FILE} bs="1M" count=${SIZE_MB} status="progress"
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo chown 0.0 ${SWAP_FILE} # /unix//a/297153/16920
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}
Iteracja 1 z Transcend 25M3 1 TB z niewielkim wykorzystaniem berofe gdzie system plików ext4
Dzienniki po uruchomieniu skryptu
sh start_matlab_with_swap.sh 16000+0 records in 16000+0 records out 16777216000 bytes (17 GB, 16 GiB) copied, 134.489 s, 125 MB/s Setting up swapspace version 1, size = 15.6 GiB (16777211904 bytes) no label, UUID=48c2835b-4499-4534-aa49-0648e15bd5d9 [sudo] password for masi: swapon /media/masi/SamiWeek/tmp/swap_file_18.7.2016 swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: insecure file owner 1000, 0 (root) suggested. swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: found swap signature: version 1d, page-size 4, same byte order swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: pagesize=4096, swapsize=16777216000, devsize=16777216000 Swap enabled. Press enter to continue start_matlab_with_swap.sh: 11: read: arg count
Uruchamianie klienta
Historia poleceń zniknęła przy pierwszym uruchomieniu Matlaba w pamięci wymiany (bilet nr 02075943), z błędem Wystąpił problem z odczytem historii poleceń - - . Po prostu uruchom ponownie Matlaba, a problem zostanie rozwiązany, jeśli masz ustawienia domyślne. Komenda
prefdir
daje/home/masi/.matlab/R2016a
która jest domyślna lokalizacja (/home/{username}/.matlab/R2016a
. Plik/home/masi/.matlab/R2016a/matlab.prf
istnieje po restarcie tutaj .... [inne błędy] ...
Zamykanie Matlaba i ponowne wpisywanie hasła w Terminalu
[sudo] password for masi: swapoff /media/masi/SamiWeek/tmp/swap_file_18.7.2016 [ bugs here! ]
Otwórz: Jak zastosować tutaj lepszą obsługę błędów pułapek błędów? Zobacz mój skrypt dla przykładu w źródle. Wątek: Jak wykonać pułapkę błędów i zamianę, jeśli wystąpił błąd / ostrzeżenie?
Permanent Swap = oddzielna konfiguracja wymiany od uruchomionego klienta
Konfiguracja wymiany
# /unix//q/297767/16920
masi@masi:~$ sudo fallocate -l 20G /mnt/.swapfile
masi@masi:~$ sudo mkswap /mnt/.swapfile
Setting up swapspace version 1, size = 20 GiB (21474832384 bytes)
no label, UUID=45df9e48-1760-47e8-84d7-7a14f56bbd72
masi@masi:~$ sudo swapon /mnt/.swapfile
swapon: /mnt/.swapfile: insecure permissions 0644, 0600 suggested.
masi@masi:~$ sudo chmod 600 /mnt/.swapfile
masi@masi:~$ free -m
total used free shared buff/cache available
Mem: 7925 1494 175 196 6255 5892
Swap: 28610 0 28610
Na końcu /etc/fstab
umieść następującą zmianę
# /unix//a/298212/16920
# /unix//a/298543/16920
# If swap is on SSD, trim blocks each time at startup.
#/mnt/.swapfile none swap defaults,discard 0 0
# If swap on External HDD, just use sw.
/media/masi/SamiWeek/.swapfile none swap sw 0 0
System: Linux Ubuntu 16.04 64 bit
jądro Linux 4.6
Linux kernel opcje: wl
Matlab: 2016a
Dziennik Matlab docs: Resolve "Out of memory" Błędy
External HDD: Transcend 1 TB StoreJet 25m3 opinię , Transcend 2 TB StoreJet 25m3
Zewnętrzny HDD plików: ext4
Zewnętrzny bufor dysku twardego: 8 MB
Powiązane wątki: Jak zwiększyć ograniczenie pamięci MATLAB w Ubuntu? (jak korzystać z mkswap, swapon dla MATLAB?) , Jak zmniejszyć wzrost pamięci fizycznej w Matlabie? , Jak rozwiązać błąd braku pamięci w Matlabie? , Jak naprawić błąd braku pamięci w Matlabie dla matrycy 10800x10800? ,Jak zwiększyć limit pamięci (ciągły oraz ogólny) w Matlab r2012b? , Jak zwiększyć blok macierzy i rozwiązać błąd braku pamięci w Matlab 2009b? , Jak rozwiązać ten problem braku pamięci dla małej zmiennej w Matlabie? , „Brak pamięci” w Matlabie. Powolne, ale trwałe rozwiązanie?
Odpowiedzi:
OK, całkiem niezła lista. Pozwól, że odpowiem bezpośrednio
W ogóle nie podoba mi się koncepcja tego skryptu. To, że masz zewnętrzny dysk twardy, którego próbujesz użyć do wymiany, to po prostu zły pomysł. Jeśli naprawdę zamierzasz to robić regularnie, zmień rozmiar partycji, aby wstawić odpowiednią partycję wymiany, dodać plik wymiany lub po prostu kupić większy dysk wewnętrzny.
Po prostu zrób matematykę. Jeśli znasz rozmiar matrycy przed rozpoczęciem programu, oblicz rozmiar w MiB i porównaj go z dostępną zamianą.
Matlab ma API, prawda? Nie sądzę, że jest to właściwe forum dla tego pytania. Nawet jeśli posiadasz API, będziesz blokował IO poprzez zamianę, więc będzie to po prostu gwałtowny pasek postępu, który tak naprawdę nie odzwierciedla rzeczywistości.
Ty nie. to, że skończyłeś obliczenia, nie oznacza, że system operacyjny jest gotowy do przydzielonych zasobów. Kiedy skończysz pisać, aby zamienić, uwolni się. Zużyłeś tak dużo pamięci, że wiele aplikacji nie może uzyskać potrzebnej pamięci, więc też używają swap. Po prostu zostaw to włączone i pozwól systemowi operacyjnemu to zrobić. Przed wykonaniem następnego biegu wyczyść pamięć podręczną.
Prawdopodobnie jest coś więcej, nie jestem ekspertem od maszyn wirtualnych Linux. Warto zbadać, jak działa alokator SLAB / SLUB i jak dostroić go do wymagań dużej pamięci. Możesz być w stanie MLOCK matlab w pamięci. To zmusza system operacyjny do zarezerwowania dla ciebie pamięci, lub po prostu się nie uruchamia, musisz także ją odblokować, gdy skończysz. Mogę to zrobić z C API w porządku, ale nie jestem pewien, jak byś to zrobił poza procesem, którego nie mogę ponownie skompilować, co wymagałoby pewnych badań.
Wreszcie jest to rodzaj rzeczy, dla której stworzono EC2. Wygląda na to, że 16G jest tym, czego potrzebujesz, m4.4xlarge ma 64G RAM przy 0,958 $ za godzinę. To mniej niż filiżanka kawy. Skryptuj swoją instalację Matlaba za pomocą uroku juju lub podobnego i zamień wszystko w obliczenia jako usługę.
Czy 16G 16 GB?
„Potrzebuję macierzy o pojemności> 100 GB. Nie wiem, czy można to zrobić za pomocą EC2”.
Czy też powinieneś wyczyścić pamięć podręczną
echo 3 > /proc/sys/vm/drop_caches
?Jak możesz MLOCK Matlab w pamięci?
man mlock
. Chociaż wygłupiałem się, kiedy to zacytowałem. To połączenie zapewnia, że możesz przydzielić całą pamięć, którą chcesz, i uniknąć zamiany, nigdy nie wykorzysta pamięci wirtualnej. Nie tego chcesz.Myślę, że możesz powiązać C API z Matlab. - - Czy masz pomysł na wyłączenie swap, jeśli w procesach wystąpi jakaś awaria?
Kiedy pytam system operacyjny o przestrzeń adresową pamięci, czasami nie zawsze się to udaje, co nie znaczy, że nie mogę spróbować ponownie. Matlab nie może wymyślić, aby dwukrotnie zadzwonić do malloc.
Tak więc, aby wpłynąć na pożądaną zmianę, jeśli 100G miejsca jest naprawdę na wagę złota, musisz dowiedzieć się, jak powiedzieć systemowi operacyjnemu, aby przyciął swój ślad pamięci (usuwając pamięć podręczną na początek), aby menedżer pamięci nie czujesz potrzebę skorzystania z dodatkowej przestrzeni wymiany, która została zapewniona. Tylko wtedy możesz poprosić menedżera pamięci o zwolnienie pliku wymiany.
Łatwo jest rozwijać takie rzeczy, jak pamięć i dyski, znacznie trudniej jest je zmniejszyć. Zmniejszenie wymusza ponowne zrównoważenie każdego użytkownika, który ma zasoby przydzielone w tym obszarze. Jeśli zamiast tego powiedziałem: „Mam macierz pamięci 100 TB, ale teraz potrzebuję tylko 60 TB, dlaczego po usunięciu 40 TB dysku tablica przestaje działać?” Odpowiedź byłaby oczywista, prawda?
Oto twoje opcje, tak jak ja to widzę.
sprawdź interfejs API Matlab C, aby sprawdzić, czy możesz uzyskać lepszą kontrolę nad sposobem przydzielania pamięci dla tych ogromnych zestawów roboczych.
refaktoryzuj swoje obliczenia, aby obliczyć to, co masz teraz, używając podmacierzy lub innej rzadkiej reprezentacji danych.
napisz swój program w C / C ++, korzystając z mnóstwa bibliotek algebry liniowej, aby wykonać obliczenia i użyć
malloc
lubmmap
anonimowo, aby przydzielić potrzebną przestrzeń adresową.źródło
echo 3 | sudo tee /proc/sys/vm/drop_caches
Nie można dedykować wymiany oprogramowania. Co możesz zrobić, to utworzyć skrypt powłoki, który utworzy wymianę, uruchom MATLAB i usuń wymianę po wyjściu MATLAB.
Oto przykładowy skrypt, który tworzy swap 10 Mb w katalogu / tmp, montuje go, uruchamia R (nie mam Matlaba), czeka R kończy, umountuje plik wymiany i usuwa go.
Uwaga: - pojawi się ostrzeżenie, ponieważ plik wymiany nie jest własnością root. Wynika to z faktu, że system użyje, jeśli nie w jakimkolwiek oprogramowaniu, być może nie uruchomionym przez Ciebie, i możesz przeczytać ten plik ... Pozwolę ci to naprawić. - jeśli [ctrl] - [c] skrypt, wylogowanie itp., zamiana pozostanie zamontowana. Pozwalam ci to naprawić.
źródło
Oto jak możesz rozszerzyć pamięć SWAP za pomocą zewnętrznego dysku twardego :
Najpierw zapisz swoją rzeczywistą pamięć SWAP, uruchamiając:
Po drugie, miej pod ręką folder swojego dysku twardego. Tak powinno być
/media/myhdd
.Utwórz plik o rozmiarze X GB za pomocą następującego polecenia w terminalu:
Utwórz plik SWAP w pliku, używając:
Na koniec włącz SWAP:
Teraz Twój SWAP wzrósł. Sprawdź ponownie za pomocą
free -m
Możemy to ustawić w nieinteraktywnym skrypcie (
sudo
potrzebne moce):PS: proszę zoptymalizować / poprawić, jeśli to możliwe. Jak powiedziałem, to mój pierwszy skrypt w historii :)
źródło
Chciałbym przynajmniej przetestować, jak dobrze działa skompresowana pamięć RAM (moduł jądra zram, dostępny od wersji jądra 3.14).
W następstwie ArchLinux instrukcjami wiki
Domyślam się, że skompresowana pamięć RAM powinna być szybsza niż dyskowe operacje we / wy.
Aby zachować zmianę również po ponownym uruchomieniu, umieść w niej polecenia czasu rozruchu
/etc/rc.local
i uruchomsudo systemctl enable rc-local.service
.źródło
sudo systemctl enable rc-local.service
zram
nie dotyczy wymiany na HDD / SSD, więczram
nie ma zastosowania tutaj, zobacz wątek askubuntu.com/a/472227/25388Użyj,
zswap
jeśli masz części wymiany na HDD / SSD. Modułzram
nie ma części wymiany na HDD / SSD, więc odpowiedź Hakali nie ma zastosowania. Zobacz wątek ZRAM vs ZSWAP vs ZCACHE Ultimate: kiedy używać wyjaśnień. Skonfigurujzswap
zgodnie z opisem w wątku Jak pomyślnie Zswap aktywować do obliczeń Matlab w Ubuntu 16.04?Zamień odpowiedni wiersz na następujący wiersz w
/etc/default/grub
Uruchom
sudo update-grub
.źródło