Come aumentare la memoria virtuale di Ubuntu e / o scambiare per Matlab?


16

Situazione: correggere Out of Memoryerrori nell'obiettivo Matlab di Ubuntu
: allocare un po 'di memoria virtuale e / o scambiare su HDD / SSD esterni; la lettura / scrittura diminuisce da 20 GBps a 0,1 GBps, il che è ok!
Terminologia: scambio e memoria virtuale qui

No, lo scambio e la memoria virtuale sono completamente diversi. Ad esempio, la mappatura della memoria di un file da 1 GB utilizza un ulteriore 1 GB di memoria virtuale ma non ha alcun cambiamento nell'uso di swap. Lo swap è una forma di negozio di supporto. Molti usi della memoria virtuale non hanno nulla a che fare con l'archivio di backup. (E ci sono stati sistemi con memoria virtuale e nessun scambio, nonché sistemi con scambio ma nessuna memoria virtuale.)

L'hardware di consumo è limitato, quindi ho bisogno di usare più memoria virtuale e / o scambiare con i miei HDD esterni. Matlab dice della memoria di scambio (TODO esclusa la memoria virtuale?)

Sistemi Linux: modifica lo spazio di swap utilizzando i comandi mkswape swapon.

Caratteristiche del sistema

  • Puoi vedere quanto ce l'hai swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Le configurazioni di Matlab

    % /programming//a/35971040/54964
    com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB
    
    % TODO cannot find ways how to put Matlab use /dev/sda3
    
  • Quindi vedi che il mio Matlab non lo sta usando. Ricevo Out of Memoryerrori con grandi matrici in Matlab. Non ho avuto successo reshapenell'ingegnere matrici di vettori e scrivere codice parallelo. Quindi voglio usare la memoria virtuale perché devo lavorare; il tasso non ha importanza.

pseudocodice

  1. Script di shell che crea uno scambio, avvia MATLAB ed elimina lo scambio quando MATLAB esce. ( MichaelHooreman )
  2. Abilita scambio su HDD esterno. Come si usa sudo swapon -aqui?
  3. Avvia Matlab.
  4. Metti Matlab usa lo swap.
  5. Elimina lo scambio quando esce Matlab.

Swap temporaneo, esecuzione del client e chiusura / rimozione dello swap nello script di Micheal

Situazione : impossibile controllare gli errori durante l'impostazione dell'ambiente (1), l'esecuzione di Matlab (2) e la chiusura dell'ambiente (3)
Script

#!/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}

Iterazione 1 con Transcend 25M3 1 TB con poco uso di file system ext4

  1. Registra dopo aver avviato lo script

    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. Esecuzione del client

    • La cronologia dei comandi è andata al primo avvio di Matlab nella memoria di scambio (ticket # 02075943), con l'errore Si è verificato un problema durante la lettura della cronologia dei comandi - - . Basta riavviare Matlab e il problema è risolto se si dispone di impostazioni predefinite. Il comando prefdirindica /home/masi/.matlab/R2016aqual è il percorso predefinito ( /home/{username}/.matlab/R2016a. Il file /home/masi/.matlab/R2016a/matlab.prfesiste dopo il riavvio, qui .

    • ... [altri errori] ...

  3. Chiudere Matlab e digitare nuovamente la password nel Terminale

    [sudo] password for masi: 
    swapoff /media/masi/SamiWeek/tmp/swap_file_18.7.2016
    [ bugs here! ]
    

Apri: Come applicare la migliore gestione degli errori del trapping degli errori qui? Vedi il mio script per l'esempio nella fonte. Thread Come eseguire il trapping degli errori e lo Swapoff in caso di errore / avviso?

Swap permanente = Impostazione di swap separata dal client in esecuzione

Impostazione di Swap

# /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

Inserire quanto segue alla fine di /etc/fstabper la modifica permanente

# /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

Sistema: Linux Ubuntu 16.04 64 bit
kernel Linux: 4.6
Opzioni del kernel Linux: wl
Matlab: 2016a
Documenti ufficiali Matlab: risoluzione errori "Memoria
esaurita " HDD esterno: Transcend 1 TB StoreJet 25M3 review , Transcend 2 TB StoreJet 25M3 File
system HDD esterno: ext4
Buffer HDD esterno: 8 MB
Thread correlati: Come aumentare la limitazione della memoria MATLAB in Ubuntu? (come utilizzare mkswap, swapon per MATLAB?) , Come ridurre l'aumento della memoria fisica in Matlab? , Come risolvere l'errore di memoria esaurita in Matlab? , Come risolvere l'errore di memoria esaurita in Matlab per matrice 10800x10800? ,Come posso aumentare il limite di memoria (sia contiguo che globale) in Matlab r2012b? , Come aumentare il blocco dell'array e risolvere l'errore di memoria insufficiente in Matlab 2009b? , Come risolvere questo problema di memoria insufficiente per una piccola variabile in Matlab? , "Memoria insufficiente" in Matlab. Una soluzione lenta ma permanente?


4
Mi dispiace, questo non risponde alla domanda. Ma sei sicuro di volerlo? Fare calcoli da swap richiede incredibilmente tempo. Ram legge almeno 20 GB al secondo, il tuo HDD esterno
leggerà

1
@Anake Sì, lo so. Non è un problema. Ho matrici enormi che possono essere calcolate con 32/64 GB ma non con il mio ultrabook da 8 GB attuale. Ho ancora bisogno di fare il calcolo in vacanza.
Léo Léopold Hertz 준영

1
Un altro commento non utile mi dispiace. Potresti lasciare un computer acceso a casa in modo da poter eseguire SSH ed eseguirli a casa / uni?
Anake,

@Anake Al momento non è possibile, scusate. Inoltre, Matlab qui ha bisogno quindi di calcoli locali. Inoltre, non disponi di chiavi sufficienti per farlo al momento.
Léo Léopold Hertz 준영

Cosa c'è di speciale in MATLAB in questo contesto? Non è solo un duplicato di Come aumentare lo spazio di swap?
Steeldriver,

Risposte:


2

OK, un bel elenco che hai lì. Lasciami rispondere in linea

  1. Come applicare la migliore gestione degli errori del trapping degli errori qui? Vedi il mio script per l'esempio nella fonte. Discussione Come eseguire il trapping degli errori e Swapoff in caso di errore / avviso ?.

Non mi piace per niente il concetto di questa sceneggiatura. Che tu abbia un hard disk esterno che stai cercando di usare come swap è solo una cattiva idea. Se hai davvero intenzione di farlo regolarmente, ridimensiona le tue partizioni per inserire una partizione di swap corretta, aggiungi un file di swap o semplicemente acquista un disco interno più grande.

  1. Come mettere avvertimenti se la dimensione della matrice supera la dimensione dello scambio?

Fai solo la matematica. Se conosci la dimensione della matrice prima dell'inizio del programma, calcola la dimensione in MiB e confrontala con lo swap disponibile.

  1. Come avere una barra di avanzamento nel calcolo della tua enorme matrice in Matlab?

matlab ha un'API giusto? Non penso che questo sia il forum giusto per questa domanda. Anche se avessi un'API, bloccherai l'IO tramite swap, quindi sarà solo una barra di avanzamento a scatti che in realtà non riflette la realtà.

  1. Come uccidere i progressi occupati e / o swapon -s / swapoff in iterazione (2)?

Non solo perché hai finito con il calcolo non significa che il sistema operativo sia fatto con le risorse che hai assegnato. Quando avrà finito di scrivere per scambiare, si libererà. Hai consumato così tanta memoria che molte applicazioni non riescono a ottenere la memoria di cui hanno bisogno, quindi usano anche lo swap. Lascialo acceso e lascia che il sistema operativo faccia la sua cosa. Prima di eseguire la prossima corsa, svuota le cache.

echo 3 > /proc/sys/vm/drop_caches 

Probabilmente c'è di più, non sono un esperto di macchine virtuali Linux. Vale la pena esaminare come funziona l'allocatore SLAB / SLUB e come ottimizzarlo per le esigenze di memoria di grandi dimensioni. Potresti essere in grado di MLLA matlab in memoria. Ciò costringe il sistema operativo a riservare memoria per te, o semplicemente non si avvia, devi anche sbloccarlo quando hai finito. Posso farlo bene con l'API C ma non sono sicuro di come lo faresti al di fuori di un processo che non posso ricompilare, che richiederebbe qualche ricerca.

Infine, questo è il genere di cose per cui EC2 è stato creato. Sembra che 16G sia ciò di cui hai bisogno, un m4.4xlarge ha 64G di RAM a $ 0,958 all'ora. È meno di una tazza di caffè. Scrivi la tua installazione di matlab usando un fascino juju o simile e trasforma il tutto in un calcolo come servizio.

16G è 16 GB?

  • Sì, normalmente quando lasciamo il suffisso intendiamo numeri base2 in unità di byte. Se vuoi essere conciso, scriveresti 16GiB.

"Ho bisogno di matrici che siano> 100 GB. Non so se è possibile farlo con EC2."

Dovresti cancellare anche le tue cache echo 3 > /proc/sys/vm/drop_caches?

  • Sì, non fa male farlo sempre. Vedi Documentazione / sysctl / vm.txt nel kernel di linux.

Come puoi MLLA Matlab in memoria?

  • man mlock. Anche se ho fatto una figuraccia quando l'ho citato. Questa chiamata assicura che è possibile allocare tutta la memoria desiderata e impedire che vengano scambiati, non utilizzerà mai la memoria virtuale. Non è quello che vuoi.

Penso che tu possa associare l'API C a Matlab. - - Hai idea di disattivare lo swap in caso di errori nei processi?

  • Sarò sincero qui, il concetto di micromanaging dei file di scambio nel modo che proponi è ridicolo. Il compito del sistema operativo è gestire le risorse e distribuirle in modo equo e coerente. Una volta che gli dai più risorse, le userà come meglio crede. Non puoi dirlo quando hai finito e strappare le risorse da sotto, il sistema operativo ti dice quando è finito.

Quando chiedo al sistema operativo uno spazio di indirizzi di memoria, a volte non sempre riesce, ciò non significa che non posso riprovare. Quel matlab non riesce a capire di chiamare due volte malloc è il problema di matlab.

Quindi, per influire sul cambiamento desiderato, se quel 100G di spazio è davvero un premio, allora devi capire come dire al sistema operativo di tagliare la sua impronta di memoria (cancellando le cache per i principianti) in modo che il gestore della memoria non lo faccia sentire la necessità di utilizzare lo spazio di swap aggiuntivo che è stato fornito. Quindi e solo allora puoi chiedere al gestore della memoria di rilasciare il file di scambio.

È facile far crescere cose come memoria e dischi, è molto più difficile ridurle. Il restringimento impone un riequilibrio di ogni utente che dispone di risorse allocate in quello spazio. Se invece ho detto "Ho un array di archiviazione da 100 TB ma ora ho bisogno solo di 60 TB, perché quando rimuovo 40 TB di disco l'array smette di funzionare?" Bene, la risposta sarebbe ovvia, giusto?

Quindi ecco le tue opzioni come la vedo io.

  1. esaminare l'API C di matlab per vedere se è possibile ottenere un migliore controllo su come viene allocata la memoria per questi enormi set di lavoro.

  2. rifattate il calcolo per calcolare ciò che avete ora usando le sottomatrie o qualche altra rappresentazione sparsa dei dati.

  3. scrivi il tuo programma in C / C ++ usando la pletora di librerie di algebra lineare là fuori per eseguire il calcolo e usare malloco mmapanonimo per allocare lo spazio degli indirizzi di cui hai bisogno.


Sì, ma potrebbe non essere sufficiente e potrebbe essere necessario attendere e riprovare prima che riesca, se mai lo fa.
ppetraki,

1
eh, il resto del tuo commento non è stato mostrato nel mio smartphone. non puoi sudo echo così, invece fallo. echo 3 | sudo tee /proc/sys/vm/drop_caches
ppetraki,

Accetto questa risposta perché ha il giusto senso nella sua risposta. Per eseguire il client nello stesso script della configurazione dell'ambiente è follemente soggetto a errori. Altre discussioni a riguardo qui unix.stackexchange.com/a/298543/16920 - - Sarebbe bello se potessi pulire il tuo corpo poco.
Léo Léopold Hertz

12

Non puoi dedicare lo swap a un software. Quello che puoi fare è creare uno script di shell che crei uno scambio, avviare MATLAB ed eliminare lo scambio quando MATLAB esce.

Ecco uno script di esempio che crea uno scambio di 10 Mb nella directory / tmp, lo monta, avvia R (non ho Matlab), aspetta R esce, smonta il file di scambio ed eliminalo.

Si noti che: - verrà visualizzato un avviso perché il file di scambio non è di proprietà di root. Questo perché il sistema utilizzerà se per qualsiasi software, forse non eseguito da te, e puoi leggere su questo file ... Ti lascio riparare. - se si [ctrl] - [c] lo script, o la disconnessione, ecc., lo scambio rimarrà montato. Ti ho lasciato riparare anche io.

#!/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}

1
Bene, non è davvero dedicato a MATLAB, ma per qualsiasi situazione che richieda temporaneamente più RAM. Si prega di notare che swapon / swapoff necessita del root (quindi: sudo)
Michael Hooreman,

1
Sì tu hai. Ecco come diventare root.
Michael Hooreman,

Buona risposta. Personalmente mi sarei avvicinato così com'era, e avrei conservato la mia sceneggiatura add-swap.sh per questi bei momenti in cui la memoria viene consumata
Sergiy Kolodyazhnyy,

Ho assegnato la grazia qui perché mi ha fatto fare le cose nel modo giusto. Non posso tuttavia accettare la risposta perché la gestione degli errori è molto difficile e incompleta. È meglio impostare lo swap separatamente dall'esecuzione di Matlab, vedere la risposta qui unix.stackexchange.com/a/298543/16920
Léo Léopold Hertz

1

Ecco come espandere la memoria SWAP utilizzando un disco rigido esterno :

  • Innanzitutto, annota la memoria SWAP effettiva eseguendo:

    free -m
    
  • In secondo luogo, tieni a portata di mano la cartella del tuo HDD. Dovrebbe essere qualcosa del genere /media/myhdd.

  • Decidi la dimensione di SWAP extra che desideri aggiungere. Diciamo, X GB.
  • Calcola la quantità di byte di quella quantità. Usando GB, questo è: Y = X * 1024 ^ 3 , dove Y è il risultato del tuo calcolo.
  • Scegli la dimensione del blocco del file (è in byte). Usiamo il valore predefinito qui: 4096 (Vedi di più su questo qui ).
  • Calcola il numero di blocchi che il file avrà: Z = Y / 4096
  • Creare un file di dimensioni X GB utilizzando il seguente comando in un terminale:

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • Crea lo SWAP nel file usando:

    sudo mkswap /media/myhdd/swapfile -f
    
  • Infine, abilita lo SWAP:

    sudo swapon -p 1000 /media/myhdd/swapfile
    

Ora il tuo SWAP è aumentato. Controlla di nuovo confree -m


Possiamo configurarlo in uno script non interattivo ( sudopoteri necessari):

#!/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: si prega di ottimizzare / correggere se possibile. Come detto, è la mia prima sceneggiatura in assoluto :)


Bene, lo scambio è già lento, ma non riesco a immaginare di avere uno scambio su unità USB. Diventerà lento come l'inferno IMHO
Michael Hooreman,

Uno script come riassunto sarebbe fantastico qui.
Léo Léopold Hertz

1
Non ho mai creato una sceneggiatura, ma ci proverò.

1

Almeno testerei quanto bene esegue la RAM compressa (modulo kernel zram, disponibile dalla versione 3.14 del kernel).

Seguendo le istruzioni del wiki di archlinux

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

La mia ipotesi è che la RAM compressa dovrebbe essere più veloce dell'I / O del disco.

Per mantenere la modifica anche dopo il riavvio, inserire /etc/rc.localed eseguire i comandi del tempo di avvio sudo systemctl enable rc-local.service.


Ho esteso la risposta al thread unix.stackexchange.com/q/297752/16920 per l'effetto di zram sulla dimensione della memoria e sulla velocità di paging. Non riesco a trovare alcun effetto sulla dimensione della memoria, probabilmente principalmente sul paging. Tuttavia, gli avvisi di systemd / ... sono aumentati con runit. Sarebbe bello sapere del tasso di errore di zram.
Léo Léopold Hertz

Nel caso di zram0, ci sono alcune statistiche disponibili in / sys / block / zram0 nei file orig_data_size e compr_data_size . Non ho molti dati scambiati lì, ma per quello che c'è il rapporto è di circa 0,35. Con quel rapporto 11 GB di dati potrebbero adattarsi a 4 GB di RAM. Ciò potrebbe significare 7 GB di dati non scambiati su disco.
JJ Hakala,

1
È possibile inserire i comandi del tempo di avvio in /etc/rc.local e quindisudo systemctl enable rc-local.service
JJ Hakala,

Ho scoperto che zramnon è applicabile per lo scambio su HDD / SSD quindi zramnon è applicabile qui, si prega di consultare la discussione askubuntu.com/a/472227/25388
Léo Léopold Hertz

1

Utilizzare zswapse si hanno porzioni di swap su HDD / SSD. Il modulo zramè senza porzioni di swap su HDD / SSD, quindi la risposta di Hakala non è applicabile. Vedi la discussione zram vs zswap vs zcache Guida definitiva: quando usare quale per le spiegazioni. Installazione zswapcome descritto nel thread Come attivare Zswap correttamente per il calcolo Matlab in Ubuntu 16.04?

  • Sostituisci la riga corrispondente con la seguente riga in /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"
    
  • Corri sudo update-grub.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.