Jak zwiększyć pamięć wirtualną Ubuntu i / lub Zamień na Matlab?

16

Sytuacja: napraw Out of Memorybłę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ń mkswapi swapon.

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 Memorybłędy z dużymi matrycami w Matlabie. Nie udało mi się wprowadzić reshapemacierzy 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

  1. Skrypt powłoki, który tworzy swap, uruchamia MATLAB i usuwa go po wyjściu z MATLAB. ( MichaelHooreman )
  2. Włącz wymianę na zewnętrznym dysku twardym. Jak korzystać sudo swapon -atutaj?
  3. Uruchom Matlab.
  4. Umieść Matlaba użyj zamiany.
  5. 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

  1. 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
    
  2. 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 prefdirdaje /home/masi/.matlab/R2016aktóra jest domyślna lokalizacja ( /home/{username}/.matlab/R2016a. Plik /home/masi/.matlab/R2016a/matlab.prfistnieje po restarcie tutaj .

    • ... [inne błędy] ...

  3. 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/fstabumieść 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?

Léo Léopold Hertz 준영
źródło
4
Przepraszamy, to nie odpowiada na pytanie. Ale czy na pewno tego chcesz? Wykonywanie obliczeń z wymiany trwa niewiarygodnie długo. Ram odczytuje co najmniej 20 GB na sekundę, zewnętrzny dysk twardy będzie odczytywał z prędkością mniejszą niż 0,1 GB / s
Anake
1
@Aake Tak, wiem. To nie jest problem. Mam ogromne macierze, które można obliczyć z 32/64 GB, ale nie z moim obecnym ultrabookiem 8 GB. Nadal muszę wykonywać obliczenia w święta.
Léo Léopold Hertz -
1
Kolejny nieprzydatny komentarz przepraszam. Czy możesz zostawić komputer w domu, aby móc SSH i uruchomić je w domu / na uczelni?
Anake
@Anake W tej chwili nie jest możliwe, przepraszam. Również Matlab tutaj potrzebuje lokalnego obliczenia. Ponadto nie masz wystarczających kluczy, aby to zrobić.
Léo Léopold Hertz 준영
Co wyróżnia MATLAB w tym kontekście? Czy to nie jest tylko kopia Jak zwiększyć przestrzeń wymiany?
steeldriver 17.07.16

Odpowiedzi:

2

OK, całkiem niezła lista. Pozwól, że odpowiem bezpośrednio

  1. 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 zrobić pułapkę błędów i zamianę, jeśli błąd / ostrzeżenie ?.

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.

  1. Jak umieścić ostrzeżenia, jeśli rozmiar matrycy przekracza rozmiar wymiany?

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ą.

  1. Jak mieć pasek postępu w obliczaniu ogromnej macierzy w Matlabie?

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.

  1. Jak zabić zajęty postęp i / lub zamianę -s / zamianę w iteracji (2)?

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ą.

echo 3 > /proc/sys/vm/drop_caches 

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?

  • Tak, zwykle, kiedy pomijamy przyrostek, mamy na myśli liczby base2 w jednostkach bajtów. Jeśli chcesz zwięźle napisać 16GiB.

„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?

  • Tak, zawsze to robi. Zobacz Documentation / sysctl / vm.txt w jądrze Linux-a.

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?

  • Będę tu szczerze mówiąc, koncepcja mikrozarządzania plikami wymiany w proponowany przez ciebie sposób jest absurdalna. Zadaniem systemu operacyjnego jest zarządzanie zasobami i wydawanie ich w sposób uczciwy i spójny. Gdy dasz mu więcej zasobów, wykorzysta je według własnego uznania. Nie powiesz tego, kiedy skończysz, i wyciągniesz zasoby spod niego, system operacyjny poinformuje Cię, kiedy to zrobisz.

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ę.

  1. sprawdź interfejs API Matlab C, aby sprawdzić, czy możesz uzyskać lepszą kontrolę nad sposobem przydzielania pamięci dla tych ogromnych zestawów roboczych.

  2. refaktoryzuj swoje obliczenia, aby obliczyć to, co masz teraz, używając podmacierzy lub innej rzadkiej reprezentacji danych.

  3. napisz swój program w C / C ++, korzystając z mnóstwa bibliotek algebry liniowej, aby wykonać obliczenia i użyć malloclub mmapanonimowo, aby przydzielić potrzebną przestrzeń adresową.

ppetraki
źródło
Tak, ale może to nie wystarczyć i być może będziesz musiał poczekać i spróbować ponownie, zanim się powiedzie.
ppetraki
1
heh, reszta twojego komentarza nie pojawiła się w moim smartfonie. zamiast tego nie można powtórzyć echa sudo. echo 3 | sudo tee /proc/sys/vm/drop_caches
ppetraki
Przyjmuję tę odpowiedź, ponieważ ma właściwy sens w swojej odpowiedzi. Uruchamianie klienta w tym samym skrypcie co konfigurowanie środowiska jest niezwykle podatne na błędy. Więcej dyskusji na ten temat tutaj unix.stackexchange.com/a/298543/16920 - - Byłoby wspaniale, gdybyś mógł trochę posprzątać swoje ciało.
Léo Léopold Hertz 준영
12

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ć.

#!/usr/bin/env bash

SWAP_FILE=/tmp/my_swap_file
SIZE_MB=10
TO_RUN="R"

dd if=/dev/zero of=${SWAP_FILE} bs=1M count=${SIZE_MB}
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
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}
Michael Hooreman
źródło
1
Cóż, nie jest tak naprawdę poświęcony MATLAB, ale w każdej sytuacji wymagającej chwilowo więcej pamięci RAM. Należy pamiętać, że swapon / swapoff wymaga
rootowania w
1
Tak ty masz. Oto jak zostać rootem.
Michael Hooreman,
Dobra odpowiedź. Osobiście podchodzę do tego i trzymam własny skrypt add-swap.sh dla tych cudownych chwil, gdy pamięć zostaje
pochłonięta
Przyznałem nagrodę tutaj, ponieważ sprawiło, że zrobiłem to we właściwy sposób. Nie mogę jednak zaakceptować odpowiedzi, ponieważ zarządzanie błędami jest bardzo trudne i niekompletne. Najlepiej jest ustawić swap oddzielnie od uruchamiania Matlaba, zobacz odpowiedź tutaj unix.stackexchange.com/a/298543/16920
Léo Léopold Hertz 준영
1

Oto jak możesz rozszerzyć pamięć SWAP za pomocą zewnętrznego dysku twardego :

  • Najpierw zapisz swoją rzeczywistą pamięć SWAP, uruchamiając:

    free -m
    
  • Po drugie, miej pod ręką folder swojego dysku twardego. Tak powinno być /media/myhdd.

  • Wybierz rozmiar dodatkowego SWAP, który chcesz dodać. Powiedzmy, X GB.
  • Oblicz ilość bajtów, jaką jest ta ilość. Używając GB, jest to: Y = X * 1024 ^ 3 , gdzie Y jest wynikiem twoich obliczeń.
  • Wybierz rozmiar bloku pliku (w bajtach). Użyjmy tutaj wartości domyślnej: 4096 (Zobacz więcej na ten temat tutaj ).
  • Oblicz liczbę bloków w pliku: Z = Y / 4096
  • Utwórz plik o rozmiarze X GB za pomocą następującego polecenia w terminalu:

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • Utwórz plik SWAP w pliku, używając:

    sudo mkswap /media/myhdd/swapfile -f
    
  • Na koniec włącz SWAP:

    sudo swapon -p 1000 /media/myhdd/swapfile
    

Teraz Twój SWAP wzrósł. Sprawdź ponownie za pomocąfree -m


Możemy to ustawić w nieinteraktywnym skrypcie ( sudopotrzebne moce):

#!/bin/bash

### Inputs ###

swap_GB=$(expr 1) # Enter here size of the swap memory to create, in GB.
swap_bs=$(expr 4096) # Enter here block size, in bytes (must be a multiple of 8).
HDD_folder="/media/myhdd/" # Enter absolute path of HDD inside the brackets.

### Swap creation ###

swap_size=$(expr $swap_GB \* 1024 \* 1024 \* 1024 / $swap_bs)
dd if=/dev/zero of=${HDD_folder}"/swapfile" bs=$swap_bs count=$swap_size
mkswap ${HDD_folder}"/swapfile" -f
swapon -p 1000 ${HDD_folder}"/swapfile"

### EOF ###

PS: proszę zoptymalizować / poprawić, jeśli to możliwe. Jak powiedziałem, to mój pierwszy skrypt w historii :)


źródło
No cóż, zamiana jest już wolna, ale nie wyobrażam sobie wymiany na dysku USB. Stanie się powolny jak diabli IMHO
Michael Hooreman
Skrypt jako podsumowanie byłby tutaj świetny.
Léo Léopold Hertz 준영
1
Nigdy nie stworzyłem skryptu, ale spróbuję.
1

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

modprobe zram
echo lz4 > /sys/block/zram0/comp_algorithm
echo 4G > /sys/block/zram0/disksize
mkswap --label zram0 /dev/zram0
swapon --priority 100 /dev/zram0

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.locali uruchom sudo systemctl enable rc-local.service.

JJ Hakala
źródło
Rozszerzyłem odpowiedź na wątek unix.stackexchange.com/q/297752/16920 pod kątem wpływu zram na rozmiar pamięci i częstotliwość stronicowania. Nie mogę znaleźć żadnego wpływu na wielkość pamięci, prawdopodobnie głównie na stronicowanie. Jednak ostrzeżenie systemd / ... wzrosło wraz z runit. Byłoby wspaniale wiedzieć o poziomie błędu zram.
Léo Léopold Hertz
W przypadku zram0 istnieją pewne statystyki dostępne w / sys / block / zram0 w plikach orig_data_size i compr_data_size . Nie mam tam zbyt wielu danych, ale dla tego, co tam jest, stosunek wynosi około 0,35. Przy takim stosunku 11 GB danych może zmieścić się w 4 GB pamięci RAM. Może to oznaczać, że 7 GB danych nie zostało zamienionych na dysk.
JJ Hakala
1
Możesz umieścić polecenia czasu rozruchu w /etc/rc.local, a następniesudo systemctl enable rc-local.service
JJ Hakala
Dowiedziałem się, że zramnie dotyczy wymiany na HDD / SSD, więc zramnie ma zastosowania tutaj, zobacz wątek askubuntu.com/a/472227/25388
Léo Léopold Hertz 준영
1

Użyj, zswapjeśli masz części wymiany na HDD / SSD. Moduł zramnie 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ń. Skonfiguruj zswapzgodnie 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

    # https://wiki.archlinux.org/index.php/Zswap
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=1 zswap.max_pool_percent=25 zswap.compressor=lzo"
    
  • Uruchom sudo update-grub.

rev Léo Léopold Hertz 준영
źródło