it-swarm.com.de

Wie kann man den virtuellen Speicher von Ubuntu erhöhen und / oder für Matlab tauschen?

Situation: Beheben Sie Out of Memory Fehler in Ubuntus Matlab
Ziel: Etwas virtuellen Speicher zuweisen und/oder auf externe Festplatte/SSD tauschen; die Lese-/Schreibgeschwindigkeit sinkt von 20 GB/s auf 0,1 GB/s, was in Ordnung ist!
Terminologie: Swap und virtueller Speicher hier

Nein, Swap und virtueller Speicher sind völlig unterschiedlich. Beispielsweise werden für die Speicherzuordnung einer 1-GB-Datei zusätzliche 1 GB virtueller Speicher benötigt, die Verwendung von Swap ändert sich jedoch nicht. Swap ist eine Art Backing Store. Viele Verwendungen des virtuellen Speichers haben nichts mit dem Sichern des Speichers zu tun. (Und es gab Systeme mit virtuellem Speicher und keinem Swap sowie Systeme mit Swap, aber keinem virtuellen Speicher.)

Consumer-Hardware ist begrenzt, sodass ich mehr virtuellen Speicher verwenden und/oder mit meinen externen Festplatten austauschen muss. Matlab sagt über den Swap-Speicher (TODO ohne virtuellen Speicher?)

Linux-Systeme - Ändern Sie Ihren Swap Space mit den Befehlen mkswap und swapon.

Eigenschaften des Systems

  • Sie können sehen, wie viel Sie haben, indem Sie swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Matlab's Konfigurationen

    % https://stackoverflow.com/a/35971040/54964
    com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB
    
    % TODO cannot find ways how to put Matlab use /dev/sda3
    
  • Sie sehen also, dass mein Matlab es nicht verwendet. Ich erhalte Out of Memory Fehler mit großen Matrizen in Matlab. Es ist mir nicht gelungen, reshape Matrizen in Vektoren zu schreiben und parallelen Code zu schreiben. Ich möchte also virtuellen Speicher verwenden, weil ich die Arbeit erledigen muss. die rate spielt keine rolle.

Pseudocode

  1. Shell-Skript, das einen Swap erstellt, MATLAB startet und den Swap löscht, wenn MATLAB beendet wird. ( MichaelHooreman )
  2. Swap auf externer Festplatte aktivieren. Wie benutzt man Sudo swapon -a hier?
  3. Starten Sie Matlab.
  4. Setze Matlab mit dem Swap ein.
  5. Swap löschen, wenn Matlab beendet wird.

Temporärer Swap, laufender Client und Schließen/Entfernen von Swap in Micheals Skript

Situation : Fehler beim Einrichten der Umgebung (1), Ausführen von Matlab (2) und Schließen der Umgebung (3) können nicht kontrolliert werden.
Skript

#!/usr/bin/env bash

# https://stackoverflow.com/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} # https://unix.stackexchange.com/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}

Iteration 1 mit Transcend 25M3 1 TB mit geringem Nutzen, da das Dateisystem ext4

  1. Protokolliert nach dem Start des Skripts

    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. Client ausführen

    • Befehlsverlauf beim ersten Start von Matlab im Auslagerungsspeicher (Ticket-Nr. 02075943) mit dem Fehler Beim Lesen des Befehlsverlaufs ist ein Problem aufgetreten - - . Starten Sie einfach Ihr Matlab neu und das Problem ist behoben, wenn Sie Standardeinstellungen haben. Der Befehl prefdir gibt /home/masi/.matlab/R2016a als Standardspeicherort an (/home/{username}/.matlab/R2016a. Die Datei /home/masi/.matlab/R2016a/matlab.prf ist nach dem Neustart vorhanden, hier .

    • ... [andere Fehler] ...

  3. Matlab schließen und Passwort erneut in Terminal eingeben

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

Öffnen: Wie wende ich hier die bessere Fehlerbehandlung für die Fehlerbehebung an? Siehe mein Skript für das Beispiel in der Quelle. Thread Fehlerbehebung und Auslagerung bei Fehler/Warnung?

Permanenter Swap = Separate Swap-Einrichtung vom laufenden Client

Swap einrichten

# https://unix.stackexchange.com/q/297767/16920
[email protected]:~$ Sudo fallocate -l 20G /mnt/.swapfile

[email protected]:~$ Sudo mkswap /mnt/.swapfile 
Setting up swapspace version 1, size = 20 GiB (21474832384 bytes)
no label, UUID=45df9e48-1760-47e8-84d7-7a14f56bbd72

[email protected]:~$ Sudo swapon /mnt/.swapfile
swapon: /mnt/.swapfile: insecure permissions 0644, 0600 suggested.

[email protected]:~$ Sudo chmod 600 /mnt/.swapfile

[email protected]:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7925        1494         175         196        6255        5892
Swap:         28610           0       28610

Fügen Sie am Ende von /etc/fstab Folgendes ein, um eine dauerhafte Änderung vorzunehmen

# https://unix.stackexchange.com/a/298212/16920
# https://unix.stackexchange.com/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
Linux-Kernel: 4.6
Linux-Kernel-Optionen: wl
Matlab: 2016a
Offizielle Matlab-Dokumente: Beheben von "Out of Memory" -Fehlern
Externe Festplatte: Transcend 1 TB StoreJet 25M3 Überprüfung , Transcend 2 TB StoreJet 25M3
Externes HDD-Dateisystem: ext4
Externer Festplattenpuffer: 8 MB
Verwandte Themen: Wie kann man die MATLAB-Speicherbeschränkung in Ubuntu erhöhen? (Wie kann man mkswap, swapon für MATLAB verwenden?) , Wie kann man die physische Speichererweiterung in Matlab reduzieren? , Wie behebe ich einen Speicherfehler in Matlab? , Wie behebe ich einen Speicherfehler in Matlab für eine 10800x10800-Matrix? , Wie erhöhe ich den Wert?) Speicherlimit (sowohl zusammenhängend als auch insgesamt) in Matlab r2012b? , Erhöhen des Array-Blocks und Beheben von Fehlern aufgrund zu geringen Speichers in Matlab 2009b? , Beheben dieses Problems aus Speicherproblem für eine kleine Variable in Matlab? , 'Nicht genügend Speicher' in Matlab. Eine langsame, aber dauerhafte Lösung?

OK, eine ganze Liste hast du da. Lassen Sie mich inline antworten

  1. Wie wende ich hier die bessere Fehlerbehandlung für die Fehlerbehebung an? Siehe mein Skript für das Beispiel in der Quelle. Thread Gewusst wie: Fehlerbehebung und Auslagerung bei Fehler/Warnung ?.

Das Konzept dieses Skripts gefällt mir überhaupt nicht. Dass Sie eine externe Festplatte haben, die Sie als Swap verwenden möchten, ist nur eine schlechte Idee. Wenn Sie dies wirklich regelmäßig tun möchten, ändern Sie die Größe Ihrer Partitionen, um eine ordnungsgemäße Auslagerungspartition hinzuzufügen, eine Auslagerungsdatei hinzuzufügen oder einfach eine größere interne Festplatte zu kaufen.

  1. Wie werden Warnungen ausgegeben, wenn die Matrixgröße die Swapgröße überschreitet?

Mach einfach die Mathe. Wenn Sie die Größe der Matrix kennen, bevor das Programm beginnt, berechnen Sie die Größe in MB und vergleichen Sie sie mit dem verfügbaren Swap.

  1. Wie kann man in Matlab einen Fortschrittsbalken für die Berechnung einer riesigen Matrix festlegen?

matlab hat eine API oder? Ich denke nicht, dass dies das richtige Forum für diese Frage ist. Selbst wenn Sie eine API hatten, werden Sie über Swap IO blockieren, so dass es nur ein ruckeliger Fortschrittsbalken ist, der die Realität nicht wirklich widerspiegelt.

  1. Wie töte ich beschäftigten Fortschritt und/oder Swapon -s/Swapoff in Iteration (2)?

Das tust du nicht. Nur weil Sie mit der Berechnung fertig sind, bedeutet dies nicht, dass das Betriebssystem mit den von Ihnen zugewiesenen Ressourcen fertig ist. Wenn das Ausschreiben zum Tauschen abgeschlossen ist, wird es freigegeben. Sie haben so viel Arbeitsspeicher verbraucht, dass viele Anwendungen nicht den Arbeitsspeicher haben, den sie benötigen, und verwenden daher auch Swap. Lass es einfach an und lass das Betriebssystem es tun. Bevor Sie Ihren nächsten Lauf durchführen, löschen Sie die Caches.

echo 3 > /proc/sys/vm/drop_caches 

Es steckt wahrscheinlich noch mehr dahinter. Ich bin kein Linux VM Experte. Es lohnt sich zu untersuchen, wie der SLAB/SLUB-Allokator funktioniert und wie er auf Ihre großen Speicheranforderungen abgestimmt wird. Möglicherweise können Sie matlab in den Speicher sperren. Dadurch wird das Betriebssystem gezwungen, Speicher für Sie zu reservieren, oder es startet einfach nicht. Sie müssen es auch entsperren, wenn Sie fertig sind. Ich kann dies mit der C-API problemlos tun, aber ich bin mir nicht sicher, wie Sie dies außerhalb eines Prozesses tun würden, den ich nicht erneut kompilieren kann. Dies würde einige Nachforschungen erfordern.

Schließlich ist dies die Art von Sachen, für die EC2 gemacht wurde. Es sieht so aus, als ob 16G genau das ist, was Sie brauchen. Ein m4.4xlarge hat 64G RAM bei 0,958 USD pro Stunde. Das ist weniger als eine Tasse Kaffee. Erstellen Sie ein Skript für Ihre matlab-Installation mit einem Juju-Zauber oder ähnlichem und verwandeln Sie das Ganze in eine Berechnung als Dienstleistung.

Ist 16G 16 GB?

  • Ja, normalerweise, wenn wir das Suffix weglassen, meinen wir base2-Zahlen in Byte-Einheiten. Wenn Sie prägnant sein möchten, würden Sie 16GiB schreiben.

"Ich benötige Matrizen mit mehr als 100 GB. Ich weiß nicht, ob Sie es mit EC2 schaffen."

Sollten Sie Ihre Caches auch durch echo 3 > /proc/sys/vm/drop_caches löschen?

  • Ja, es tut nicht weh, das immer zu tun. Siehe Dokumentation/sysctl/vm.txt im Linux-Kernel.

Wie können Sie MLOCK Matlab in Erinnerung behalten?

  • man mlock. Obwohl ich vermasselt habe, als ich das zitierte. Durch diesen Aufruf wird sichergestellt, dass Sie den gesamten gewünschten Speicher zuweisen und verhindern können, dass dieser ausgelagert wird. Der virtuelle Speicher wird nie verwendet. Das ist nicht was du willst.

Ich denke, Sie können C API an Matlab binden. - - Haben Sie eine Idee, Swap zu deaktivieren, wenn ein Fehler in den Prozessen auftritt?

  • Ich werde hier ehrlich sein, das Konzept der Verwaltung von Auslagerungsdateien in der von Ihnen vorgeschlagenen Weise ist lächerlich. Die Aufgabe des Betriebssystems ist es, Ressourcen zu verwalten und sie auf faire und konsistente Weise zu verteilen. Sobald Sie mehr Ressourcen zur Verfügung stellen, werden diese nach Belieben verwendet. Sie können es nicht sagen, wenn Sie fertig sind und ziehen Ressourcen darunter hervor. Das Betriebssystem teilt Ihnen mit, wann es fertig ist.

Wenn ich das Betriebssystem nach einem Speicheradressraum frage, gelingt dies manchmal nicht immer, was nicht bedeutet, dass ich es nicht erneut versuchen kann. Dass matlab nicht herausfinden kann, wie man malloc zweimal anruft, ist das Problem von matlab.

Um die gewünschte Änderung zu beeinflussen, müssen Sie herausfinden, wie das Betriebssystem angewiesen werden soll, wenn diese 100 GB Speicherplatz wirklich einen hohen Stellenwert haben Reduzieren Sie den Speicherbedarf (indem Sie zunächst die Caches leeren), damit der Speichermanager nicht den zusätzlichen Auslagerungsspeicher benötigt, den er zur Verfügung gestellt hat. Dann und nur dann können Sie den Speichermanager auffordern, die Auslagerungsdatei freizugeben.

Es ist einfach, Dinge wie Speicher und Festplatten zu vergrößern, und es ist viel schwieriger, sie zu verkleinern. Durch das Verkleinern wird ein Neuausgleich aller Benutzer erzwungen, denen in diesem Bereich Ressourcen zugewiesen sind. Wenn ich stattdessen sagte: "Ich habe ein 100-TB-Speicherarray, aber jetzt benötige ich nur 60 TB. Warum funktioniert das Array nicht mehr, wenn ich 40 TB Festplatte entferne?" Nun, die Antwort wäre klar, oder?

Also hier sind Ihre Optionen, wie ich es sehe.

  1. untersuchen Sie die matlab C-API, um festzustellen, ob Sie die Speicherzuweisung für diese umfangreichen Arbeitssätze besser steuern können.

  2. überarbeiten Sie Ihre Berechnung, um zu berechnen, was Sie jetzt haben, indem Sie Submatrizen oder eine andere spärliche Datendarstellung verwenden.

  3. schreiben Sie Ihr eigenes Programm in C/C++, indem Sie die zahlreichen linearen Algebra-Bibliotheken verwenden, um die Berechnung durchzuführen, und verwenden Sie malloc oder mmap anonym, um den von Ihnen benötigten Adressraum zuzuweisen.

2
ppetraki

Sie können keinen Swap für eine Software reservieren. Sie können ein Shell-Skript erstellen, das einen Swap erstellt, MATLAB startet und den Swap löscht, wenn MATLAB beendet wird.

Hier ist ein Beispielskript, das einen Swap von 10 MB im Verzeichnis/tmp erstellt, diesen einbindet, R startet (ich habe kein Matlab), auf das Beenden von R wartet, die Swap-Datei umbindet und sie löscht.

Beachten Sie Folgendes: - Es wird eine Warnung angezeigt, da die Auslagerungsdatei nicht im Besitz von root ist. Das liegt daran, dass das System für jede Software verwendet wird, die möglicherweise nicht von Ihnen ausgeführt wird, und Sie können diese Datei lesen ... Ich lasse Sie es reparieren. - Wenn Sie [Strg] - [c] das Skript oder Abmelden oder usw., bleibt der Swap aktiviert. Ich lasse dich das auch reparieren.

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

Ich würde zumindest testen, wie gut die Leistung von RAM (zram-Kernelmodul, verfügbar seit Kernelversion 3.14) ist.

Befolgen Sie Anweisungen des Archlinux-Wikis

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

Ich vermute, dass komprimiertes RAM schneller sein sollte als Festplatten-E/A.

Um die Änderung auch nach dem Neustart beizubehalten, platzieren Sie die Startbefehle in /etc/rc.local und führen Sie Sudo systemctl enable rc-local.service aus.

1
J.J. Hakala

So können Sie Ihren SWAP-Speicher mit einer externen Festplatte erweitern :

  • Notieren Sie sich zunächst Ihren tatsächlichen SWAP-Speicher, indem Sie Folgendes ausführen:

    free -m
    
  • Zweitens haben Sie den Ordner Ihrer Festplatte zur Hand. Es sollte so etwas wie /media/myhdd sein.

  • Bestimmen Sie die Größe des zusätzlichen SWAP, den Sie hinzufügen möchten. Nehmen wir an, X GB.
  • Berechnen Sie die Anzahl der Bytes, die die Menge ist. Mit GB ist dies: Y = X * 1024 ^ 3 , wobei Y ist das Ergebnis Ihrer Berechnung.
  • Wählen Sie die Blockgröße der Datei (in Byte). Verwenden wir hier die Standardeinstellung: 4096 (Weitere Informationen hierzu hier ).
  • Berechnen Sie die Anzahl der Blöcke, die die Datei haben wird: Z = Y/4096
  • Erstellen Sie eine Datei der Größe X GB mit dem folgenden Befehl in einem Terminal:

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • Erstellen Sie den SWAP in der Datei mit:

    Sudo mkswap /media/myhdd/swapfile -f
    
  • Aktivieren Sie zum Schluss den SWAP:

    Sudo swapon -p 1000 /media/myhdd/swapfile
    

Jetzt hat sich dein SWAP erhöht. Überprüfe es erneut mit free -m


Wir können dies in einem nicht interaktiven Skript einrichten (Sudo Kräfte erforderlich):

#!/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: bitte nach Möglichkeit optimieren/korrigieren. Wie gesagt, es ist mein erstes Drehbuch überhaupt :)

1
user308164

Verwenden Sie zswap, wenn Sie Teile auf der Festplatte/SSD austauschen. Tho Modul zram hat keine Swap-Bereiche auf der Festplatte/SSD, daher ist Hakalas Antwort nicht zutreffend. Weitere Erklärungen finden Sie im Thread zram vs zswap vs zcache Ultimate-Handbuch: Wann soll welches verwendet werden? . Richten Sie zswap wie im Thread beschrieben ein So aktivieren Sie Zswap erfolgreich für die Matlab-Berechnung in Ubuntu 16.04?

  • Ersetzen Sie die entsprechende Zeile durch die folgende Zeile 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"
    
  • Führen Sie Sudo update-grub aus.