Situation: corriger les Out of Memory
erreurs dans Matlab d'Ubuntu
Objectif: allouer de la mémoire virtuelle et / ou Swap sur disque dur externe / SSD; la lecture / écriture passe de 20 Go / s à 0,1 Go / s, ce qui est correct!
Terminologie: swap et mémoire virtuelle ici
Non, le swap et la mémoire virtuelle sont complètement différents. Par exemple, le mappage de la mémoire d'un fichier de 1 Go utilise 1 Go supplémentaire de mémoire virtuelle mais n'a aucun changement dans l'utilisation du swap. Le swap est une forme de magasin de sauvegarde. De nombreuses utilisations de la mémoire virtuelle n'ont rien à voir avec le stockage de sauvegarde. (Et il y a eu des systèmes avec mémoire virtuelle et pas de swap ainsi que des systèmes avec swap mais pas de mémoire virtuelle.)
Le matériel grand public est limité, je dois donc utiliser plus de mémoire virtuelle et / ou échanger avec mes disques durs externes. Matlab parle de la mémoire de swap (TODO hors mémoire virtuelle?)
Systèmes Linux - Modifiez votre espace de swap à l'aide des commandes
mkswap
etswapon
.
Caractéristiques du système
Vous pouvez voir combien vous en avez
swapon -s
Filename Type Size Used Priority /dev/sda3 partition 8326140 0 -1
Configurations de Matlab
% /programming//a/35971040/54964 com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB % TODO cannot find ways how to put Matlab use /dev/sda3
Vous voyez donc que mon Matlab ne l'utilise pas. Je reçois des
Out of Memory
erreurs avec de grandes matrices dans Matlab. Je n'ai pas réussi àreshape
intégrer des matrices aux vecteurs et à écrire du code parallèle. Je veux donc utiliser la mémoire virtuelle parce que je dois faire le travail; le taux n'a pas d'importance.
Pseudocode
- Script shell qui crée un swap, lancez MATLAB et supprimez le swap lorsque MATLAB se ferme. ( MichaelHooreman )
- Activer l'échange sur le disque dur externe. Comment l'utiliser
sudo swapon -a
ici? - Démarrez Matlab.
- Mettez Matlab utiliser le swap.
- Supprimer l'échange à la sortie de Matlab.
Swap temporaire, exécution du client et fermeture / suppression du swap dans le script de Micheal
Situation : impossible de contrôler les erreurs lors de la configuration de l'environnement (1), de l'exécution de Matlab (2) et de la fermeture de l'environnement (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}
Itération 1 avec Transcend 25M3 1 To avec peu d'utilisation berofe où le système de fichiers ext4
Journaux après le démarrage du 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
Exécuter le client
L'historique des commandes a disparu au premier démarrage de Matlab dans la mémoire de swap (ticket # 02075943), avec l'erreur Un problème est survenu lors de la lecture de l'historique de vos commandes - - . Redémarrez simplement votre Matlab et le problème est résolu si vous avez des paramètres par défaut. La commande
prefdir
indique/home/masi/.matlab/R2016a
quel est l'emplacement par défaut (/home/{username}/.matlab/R2016a
. Le fichier/home/masi/.matlab/R2016a/matlab.prf
existe après le redémarrage, ici .... [autres erreurs] ...
Fermer Matlab et saisir à nouveau le mot de passe dans le terminal
[sudo] password for masi: swapoff /media/masi/SamiWeek/tmp/swap_file_18.7.2016 [ bugs here! ]
Ouvrir: Comment appliquer ici la meilleure gestion des erreurs de la récupération des erreurs? Voir mon script pour l'exemple dans la source. Thread Comment faire le recouvrement d'erreur et le swapoff en cas d'erreur / d'avertissement?
Swap permanent = configuration de swap distincte du client en cours d'exécution
Configuration de 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
Mettez ce qui suit à la fin de /etc/fstab
pour le changement permanent
# /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
Système: Linux Ubuntu 16.04 64 bits
noyau Linux: 4.6
Options du noyau Linux: wl
Matlab: 2016A
officiel Matlab docs: Resolve "Mémoire insuffisante" Erreurs
disque dur externe: Transcend 1 To StoreJet 25M3 examen , Transcend 2 To StoreJet 25M3
système de fichiers du disque dur externe: ext4
Tampon de disque dur externe: 8 Mo
Threads associés: Comment augmenter la limitation de mémoire MATLAB dans Ubuntu? (comment utiliser mkswap, swapon pour MATLAB?) , Comment réduire l'augmentation de la mémoire physique dans Matlab? , Comment résoudre l'erreur de mémoire insuffisante dans Matlab? , Comment réparer une erreur de mémoire insuffisante dans Matlab pour la matrice 10800x10800? ,Comment augmenter la limite de mémoire (contiguë et globale) dans Matlab r2012b? , Comment augmenter le bloc de tableau et résoudre l'erreur de mémoire insuffisante dans Matlab 2009b? , Comment résoudre ce problème de mémoire insuffisante pour une petite variable dans Matlab? , 'Out of memory' dans Matlab. Une solution lente mais permanente?
Réponses:
OK, toute une liste que vous avez là. Permettez-moi de répondre en ligne
Je n'aime pas du tout le concept de ce script. Que vous ayez un disque dur externe que vous essayez d'utiliser comme échange est juste une mauvaise idée. Si vous avez vraiment l'intention de le faire régulièrement, redimensionnez vos partitions pour y insérer une partition de swap appropriée, ajoutez un fichier de swap ou achetez simplement un disque interne plus gros.
Faites le calcul. Si vous connaissez la taille de la matrice avant le début du programme, calculez la taille en Mio et comparez-la au swap disponible.
matlab a un droit API? Je ne pense pas que ce soit le bon forum pour cette question. Même si vous aviez une API, vous bloquerez les E / S via l'échange, ce ne sera donc qu'une barre de progression saccadée qui ne reflète pas réellement la réalité.
Non. ce n'est pas parce que vous avez terminé le calcul que le système d'exploitation a terminé avec les ressources que vous avez allouées. Une fois l'écriture terminée pour l'échanger, cela se libérera. Vous avez consommé tellement de mémoire que de nombreuses applications ne peuvent pas obtenir la mémoire dont elles ont besoin, elles utilisent donc aussi le swap. Laissez-le simplement allumé et laissez le système d'exploitation faire son travail. Avant d'effectuer votre prochaine course, effacez les caches.
Il y a probablement plus que cela, je ne suis pas un expert des machines virtuelles Linux. Il serait intéressant d'étudier le fonctionnement de l'allocateur SLAB / SLUB et de le régler pour vos besoins en mémoire volumineux. Vous pourrez peut-être MLOCK matlab en mémoire. Cela oblige le système d'exploitation à vous réserver de la mémoire, ou il ne démarre tout simplement pas, vous devez également le déverrouiller lorsque vous avez terminé. Je peux le faire avec l'API C très bien, mais je ne sais pas comment vous feriez cela en dehors d'un processus que je ne peux pas recompiler, cela nécessiterait des recherches.
Enfin, c'est le genre de choses pour lesquelles EC2 a été conçu. Il semble que 16G soit ce dont vous avez besoin, un m4.4xlarge a 64G de RAM à 0,958 $ par heure. C'est moins d'une tasse de café. Créez un script pour votre installation de matlab en utilisant un charme juju ou similaire et transformez le tout en un calcul en tant que service.
Est-ce que 16G 16 Go?
"J'ai besoin de matrices> 100 Go. Je ne sais pas si vous pouvez le faire avec EC2."
Devez-vous également vider vos caches
echo 3 > /proc/sys/vm/drop_caches
?Comment pouvez-vous MLOCK Matlab en mémoire?
man mlock
. Même si j'ai fait des gaffes quand j'ai cité ça. Cet appel garantit que vous pouvez allouer toute la mémoire que vous souhaitez et éviter d'être échangé, il n'utilisera jamais de mémoire virtuelle. Ce n'est pas ce que tu veux.Je pense que vous pouvez lier l'API C à Matlab. - - Avez-vous une idée de désactiver le swap en cas de défaillance des processus?
Lorsque je demande au système d'exploitation un espace d'adressage mémoire, parfois cela ne réussit pas toujours, cela ne signifie pas que je ne peux pas réessayer. Ce matlab ne peut pas comprendre d'appeler malloc deux fois est le problème de matlab.
Donc, pour affecter le changement que vous souhaitez, si ces 100 Go d'espace sont vraiment à un prix supérieur, vous devez comprendre comment dire au système d'exploitation de réduire son empreinte mémoire (en effaçant les caches pour les démarreurs) afin que le gestionnaire de mémoire ne le fasse pas. ressentir le besoin d'utiliser l'espace de swap supplémentaire qui lui a été fourni. Alors et seulement alors, vous pouvez demander au gestionnaire de mémoire de libérer le fichier d'échange.
Il est facile de développer des choses comme la mémoire et les disques, il est beaucoup plus difficile de les réduire. Le rétrécissement force un rééquilibrage de chaque utilisateur disposant de ressources allouées dans cet espace. Si j'ai plutôt dit "J'ai une baie de stockage de 100 To mais maintenant je n'ai besoin que de 60 To, pourquoi est-ce quand je retire 40 To de disque que la baie cesse de fonctionner?" Eh bien, la réponse serait évidente, non?
Voici donc vos options telles que je les vois.
examinez l'API matlab C pour voir si vous pouvez mieux contrôler la façon dont la mémoire est allouée pour ces ensembles de travail massifs.
refactorisez votre calcul pour calculer ce que vous avez maintenant en utilisant des sous-matrices ou une autre représentation de données clairsemée.
écrivez votre propre programme en C / C ++ en utilisant la pléthore de bibliothèques d'algèbre linéaire là-bas pour effectuer le calcul et utiliser
malloc
oummap
anonyme pour allouer l'espace d'adressage dont vous avez besoin.la source
echo 3 | sudo tee /proc/sys/vm/drop_caches
Vous ne pouvez pas dédier un échange à un logiciel. Ce que vous pouvez faire, c'est créer un script shell qui crée un swap, démarrer MATLAB et supprimer le swap à la fin de MATLAB.
Voici un exemple de script qui crée un swap de 10 Mo dans le répertoire / tmp, le monte, démarre R (je n'ai pas de matlab), attend R quitte, démonte le fichier swap et le supprime.
Veuillez noter que: - vous aurez un avertissement car le fichier d'échange n'appartient pas à root. C'est parce que le système utilisera si pour n'importe quel logiciel, peut-être pas géré par vous, et vous pouvez lire sur ce fichier ... Je vous laisse le corriger. - si vous [ctrl] - [c] le script, ou la fermeture de session, ou etc., le swap restera monté. Je vous laisse le réparer aussi.
la source
Voici comment vous pouvez étendre votre mémoire SWAP à l'aide d'un disque dur externe :
Tout d'abord, notez votre mémoire SWAP réelle en exécutant:
Deuxièmement, ayez sous la main le dossier de votre disque dur. Cela devrait ressembler à quelque chose
/media/myhdd
.Créez un fichier de taille X Go à l'aide de la commande suivante dans un terminal:
Créez le SWAP dans le fichier en utilisant:
Enfin, activez le SWAP:
Maintenant, votre SWAP a augmenté. Vérifiez à nouveau avec
free -m
Nous pouvons configurer cela dans un script non interactif (
sudo
pouvoirs nécessaires):PS: veuillez optimiser / corriger si possible. Comme dit, c'est mon tout premier script :)
la source
Je voudrais au moins tester la performance de la RAM compressée (module de noyau zram, disponible depuis la version 3.14 du noyau).
Suivre les instructions du wiki archlinux
Je suppose que la RAM compressée devrait être plus rapide que les E / S disque.
Pour conserver la modification également après le redémarrage, placez les commandes de démarrage
/etc/rc.local
et exécutez-lessudo systemctl enable rc-local.service
.la source
sudo systemctl enable rc-local.service
zram
ne s'applique pas au swap sur disque dur / SSD, donczram
ne s'applique pas ici, veuillez consulter le thread askubuntu.com/a/472227/25388À utiliser
zswap
si vous avez des parties d'échange sur disque dur / SSD. Le modulezram
est sans parties d'échange sur le disque dur / SSD, donc la réponse de Hakala n'est pas applicable. Voir le fil zram vs zswap vs zcache Ultimate guide: quand utiliser lequel pour des explications. Configurationzswap
comme décrit dans le fil de discussion Comment activer Zswap avec succès pour le calcul Matlab dans Ubuntu 16.04?Remplacez la ligne correspondante par la ligne suivante dans
/etc/default/grub
Courez
sudo update-grub
.la source