Situation: Out of Memory
Fehler in Ubuntus Matlab beheben
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
undswapon
.
Eigenschaften des Systems
Sie können sehen, wie viel Sie davon haben
swapon -s
Filename Type Size Used Priority /dev/sda3 partition 8326140 0 -1
Matlab's Konfigurationen
% /programming//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
in Matlab Fehler mit großen Matrizen. Es ist mir nichtreshape
gelungen, Matrizen für Vektoren zu erstellen und parallelen Code zu schreiben. Ich möchte also virtuellen Speicher verwenden, weil ich die Arbeit erledigen muss. die rate spielt keine rolle.
Pseudocode
- Shell-Skript, das einen Swap erstellt, MATLAB startet und den Swap löscht, wenn MATLAB beendet wird. ( MichaelHooreman )
- Swap auf externer Festplatte aktivieren. Wie man
sudo swapon -a
hier benutzt? - Starten Sie Matlab.
- Setze Matlab mit dem Swap ein.
- Swap löschen, wenn Matlab beendet wird.
Temporärer Swap, Client ausführen und Swap in Micheals Skript schließen / entfernen
Situation : kann keinen Fehler steuert in die Umgebung der Einrichtung (1), läuft Matlab (2) und Schließen die Umwelt (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}
Iteration 1 mit Transcend 25M3 1 TB mit wenig Gebrauch über wo Dateisystem ext4
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
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. Befehl
prefdir
gibt an,/home/masi/.matlab/R2016a
welches der Standardspeicherort ist (/home/{username}/.matlab/R2016a
. Datei/home/masi/.matlab/R2016a/matlab.prf
existiert nach dem Neustart, hier .... [andere Fehler] ...
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 Wie mache ich Fehlerbehebung und Swapoff wenn Fehler / Warnung?
Permanenter Swap = Separate Swap-Einrichtung vom laufenden Client
Swap einrichten
# /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
Setzen Sie am Ende von /etc/fstab
für die dauerhafte Änderung Folgendes ein
# /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-
Linux-Kernel: 4.6
Linux-Kernel-Optionen: wl
Matlab: 2016a
Offizielle Matlab-Dokumente : Beheben von Fehlern aufgrund von Speichermangel
Externe Festplatte: Transcend 1 TB StoreJet 25M3- Test , Transcend 2 TB StoreJet 25M3
Externes HDD-Dateisystem: ext4
Externer Festplattenpuffer: 8 MB
Verwandte Themen: Wie kann die MATLAB-Speicherbeschränkung in Ubuntu erhöht werden? (wie benutzt man mkswap, swapon für MATLAB?) , Wie kann man die Zunahme des physischen Speichers in Matlab reduzieren? , Wie kann ein Speicherfehler in Matlab behoben werden? , Wie man aus Gedächtnisstörung in Matlab für Matrix 10800x10800 heraus regelt? ,Wie erhöhe ich das Speicherlimit (sowohl zusammenhängend als auch insgesamt) in Matlab r2012b? , Wie kann der Array-Block erhöht und ein Speicherfehler in Matlab 2009b behoben werden? , Wie behebt man dieses Problem mit zu wenig Arbeitsspeicher für eine kleine Variable in Matlab? , 'Nicht genügend Speicher' in Matlab. Eine langsame, aber dauerhafte Lösung?
Antworten:
OK, eine ganze Liste hast du da. Lassen Sie mich inline antworten
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.
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.
matlab hat eine API oder? Ich denke nicht, dass dies das richtige Forum für diese Frage ist. Selbst wenn Sie eine API hatten, blockieren Sie die Eingabe per Swap, sodass es nur ein ruckeliger Fortschrittsbalken ist, der die Realität nicht widerspiegelt.
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 frei. 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.
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?
"Ich benötige Matrizen mit mehr als 100 GB. Ich weiß nicht, ob Sie es mit EC2 schaffen."
Sollten Sie Ihre Caches auch durch löschen
echo 3 > /proc/sys/vm/drop_caches
?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?
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.
Also, um Einfluss auf die Änderung , die Sie wollen, wenn das 100G Platz ist wirklich an einer Prämie , dann müssen Sie herausfinden, wie das Betriebssystem zu erklären , um es den Speicherbedarf trim (durch Clearing - Caches für den Anfang) , so der Speicher - Manager nicht das Bedürfnis verspüren, den bereitgestellten zusätzlichen Auslagerungsspeicher zu nutzen. 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.
Untersuchen Sie die matlab C-API, um festzustellen, ob Sie die Speicherzuweisung für diese umfangreichen Arbeitssätze besser steuern können.
Überarbeiten Sie Ihre Berechnung, um zu berechnen, was Sie jetzt haben, indem Sie Submatrizen oder eine andere spärliche Datendarstellung verwenden.
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
odermmap
anonym, um den von Ihnen benötigten Adressraum zuzuweisen.quelle
echo 3 | sudo tee /proc/sys/vm/drop_caches
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: - Sie erhalten eine Warnung, 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.
quelle
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:
Zweitens haben Sie den Ordner Ihrer Festplatte zur Hand. Es sollte so etwas sein
/media/myhdd
.Erstellen Sie eine Datei der Größe X GB mit dem folgenden Befehl in einem Terminal:
Erstellen Sie den SWAP in der Datei mit:
Aktivieren Sie zum Schluss den SWAP:
Jetzt hat sich dein SWAP erhöht. Prüfen Sie noch einmal mit
free -m
Wir können dies in einem nicht interaktiven Skript einrichten (
sudo
benötigte Fähigkeiten):PS: bitte nach Möglichkeit optimieren / korrigieren. Wie gesagt, es ist mein erstes Drehbuch überhaupt :)
quelle
Ich würde zumindest testen, wie gut komprimiertes RAM (zram-Kernelmodul, verfügbar seit Kernel-Version 3.14) funktioniert.
Im Anschluss an archlinux Wiki Anweisungen
Ich vermute, dass komprimierter RAM schneller sein sollte als Festplatten-E / A.
Um die Änderung auch nach dem Neustart beizubehalten, geben Sie die Befehle für die Startzeit ein
/etc/rc.local
und führen Sie sie aussudo systemctl enable rc-local.service
.quelle
sudo systemctl enable rc-local.service
zram
für Swap auf HDD / SSD nicht anwendbar ist , sozram
ist hier nicht anwendbar, bitte den Faden sehen askubuntu.com/a/472227/25388Verwenden
zswap
Sie diese Option, wenn Sie Teile auf der Festplatte / SSD austauschen. Da das Modulzram
keine Swap-Teile auf der Festplatte / SSD enthält, ist Hakalas Antwort nicht zutreffend. Siehe den Faden zram vs zswap vs zcache Ultimate Guide: wenn zu verwenden , die eine für Erklärungen. Setupzswap
wie im Thread beschrieben Wie aktiviere ich Zswap erfolgreich für die Matlab-Berechnung in Ubuntu 16.04?Ersetzen Sie die entsprechende Zeile durch die folgende Zeile in
/etc/default/grub
Rennen
sudo update-grub
.quelle