Comment augmenter la mémoire virtuelle d'Ubuntu et / ou échanger pour Matlab?


16

Situation: corriger les Out of Memoryerreurs 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 mkswapet swapon.

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 Memoryerreurs avec de grandes matrices dans Matlab. Je n'ai pas réussi à reshapeinté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

  1. Script shell qui crée un swap, lancez MATLAB et supprimez le swap lorsque MATLAB se ferme. ( MichaelHooreman )
  2. Activer l'échange sur le disque dur externe. Comment l'utiliser sudo swapon -aici?
  3. Démarrez Matlab.
  4. Mettez Matlab utiliser le swap.
  5. 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

  1. 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
    
  2. 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 prefdirindique /home/masi/.matlab/R2016aquel est l'emplacement par défaut ( /home/{username}/.matlab/R2016a. Le fichier /home/masi/.matlab/R2016a/matlab.prfexiste après le redémarrage, ici .

    • ... [autres erreurs] ...

  3. 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/fstabpour 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?


4
Désolé, cela ne répond pas à la question. Mais êtes-vous sûr de vouloir cela? Faire des calculs à partir d'un échange prend incroyablement longtemps. Ram lit au moins 20 Go par seconde, votre disque dur externe lira à moins de 0,1 Go
s

1
@Anake Oui, je sais. Ce n'est pas un problème. J'ai d'énormes matrices qui peuvent être calculées avec 32/64 Go mais pas avec mon ultrabook actuel de 8 Go. J'ai encore besoin de faire le calcul en vacances.
Léo Léopold Hertz

1
Un autre commentaire non utile désolé. Pourriez-vous laisser un ordinateur allumé à la maison pour pouvoir SSH et les exécuter à la maison / uni?
Anake

@Anake Pas possible, désolé pour le moment. De plus, Matlab a donc besoin d'un calcul local. De plus, ne disposez pas de clés suffisantes pour le faire pour le moment.
Léo Léopold Hertz

Quelle est la particularité de MATLAB dans ce contexte? N'est-ce pas simplement un doublon de Comment augmenter l'espace de swap?
steeldriver

Réponses:


2

OK, toute une liste que vous avez là. Permettez-moi de répondre en ligne

  1. Comment appliquer la meilleure gestion des erreurs de la récupération des erreurs ici? Voir mon script pour l'exemple dans la source. Thread How to Do Error-trapping and Swapoff if Error / Warning ?.

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.

  1. Comment mettre des avertissements si la taille de la matrice dépasse la taille du swap?

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.

  1. Comment avoir une barre de progression dans le calcul de votre énorme matrice dans Matlab?

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

  1. Comment tuer les progrès occupés et / ou swapon -s / swapoff dans l'itération (2)?

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.

echo 3 > /proc/sys/vm/drop_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?

  • Oui, normalement lorsque nous supprimons le suffixe, nous entendons les nombres base2 en unités d'octets. Si vous voulez être concis, vous écrirez 16GiB.

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

  • Oui, ça ne fait pas de mal de toujours faire ça. Voir Documentation / sysctl / vm.txt dans le noyau linux.

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?

  • Je vais être franc ici, le concept de microgestion des fichiers d'échange de la manière que vous proposez est ridicule. Le travail du système d'exploitation consiste à gérer les ressources et à les distribuer de manière équitable et cohérente. Une fois que vous lui aurez donné plus de ressources, il les utilisera comme bon lui semble. Vous n'avez pas la possibilité de le dire lorsque vous avez terminé et de retirer les ressources par-dessous, le système d'exploitation vous indique quand c'est fait.

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.

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

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

  3. é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 mallocou mmapanonyme pour allouer l'espace d'adressage dont vous avez besoin.


Oui, mais cela pourrait ne pas être suffisant et vous devrez peut-être attendre et réessayer avant de réussir, si jamais cela se produit.
ppetraki

1
heh, le reste de votre commentaire n'est pas apparu sur mon smartphone. vous ne pouvez pas faire écho sudo comme ça, à la place. echo 3 | sudo tee /proc/sys/vm/drop_caches
ppetraki

J'accepte cette réponse car elle a le bon sens dans sa réponse. Exécuter le client dans le même script que la configuration de l'environnement est extrêmement sujet aux erreurs. Plus de discussion à ce sujet ici unix.stackexchange.com/a/298543/16920 - - Ce serait formidable si vous pouviez nettoyer votre corps peu.
Léo Léopold Hertz

12

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.

#!/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
Eh bien, il n'est pas vraiment dédié à MATLAB, mais pour toute situation nécessitant temporairement plus de RAM. Veuillez noter que swapon / swapoff doit être root (donc: sudo)
Michael Hooreman

1
Oui tu as. Voilà comment devenir root.
Michael Hooreman

Bonne réponse. Personnellement, je l'approcherais et garderais mon propre script add-swap.sh pour ces beaux moments où la mémoire est consommée
Sergiy Kolodyazhnyy

J'ai attribué la prime ici parce que cela m'a fait avancer les choses correctement. Je ne peux cependant pas accepter la réponse car la gestion des erreurs est très difficile et incomplète. Il est préférable de configurer le swap séparément de l'exécution de Matlab, veuillez voir la réponse ici unix.stackexchange.com/a/298543/16920
Léo Léopold Hertz

1

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:

    free -m
    
  • Deuxièmement, ayez sous la main le dossier de votre disque dur. Cela devrait ressembler à quelque chose /media/myhdd.

  • Décidez de la taille du SWAP supplémentaire que vous souhaitez ajouter. Disons, X GB.
  • Calculez la quantité d'octets de cette quantité. En utilisant GB, c'est: Y = X * 1024 ^ 3 , où Y est le résultat de votre calcul.
  • Choisissez la taille de bloc du fichier (elle est en octets). Utilisons la valeur par défaut ici: 4096 (Voir plus à ce sujet ici ).
  • Calculez le nombre de blocs que le fichier aura: Z = Y / 4096
  • Créez un fichier de taille X Go à l'aide de la commande suivante dans un terminal:

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • Créez le SWAP dans le fichier en utilisant:

    sudo mkswap /media/myhdd/swapfile -f
    
  • Enfin, activez le SWAP:

    sudo swapon -p 1000 /media/myhdd/swapfile
    

Maintenant, votre SWAP a augmenté. Vérifiez à nouveau avecfree -m


Nous pouvons configurer cela dans un script non interactif ( sudopouvoirs nécessaires):

#!/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: veuillez optimiser / corriger si possible. Comme dit, c'est mon tout premier script :)


Eh bien, le swap est déjà lent, mais je ne peux pas imaginer le swap sur clé USB. Cela deviendra lent comme l'enfer IMHO
Michael Hooreman

Un script comme résumé serait génial ici.
Léo Léopold Hertz

1
Je n'ai jamais créé de script, mais je vais essayer.

1

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

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

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.localet exécutez-les sudo systemctl enable rc-local.service.


J'ai étendu la réponse au thread unix.stackexchange.com/q/297752/16920 pour l'effet de zram sur la taille de la mémoire et le taux de pagination. Je ne trouve aucun effet sur la taille de la mémoire, probablement principalement sur la pagination. Cependant, l'avertissement systemd / ... a augmenté avec runit. Ce serait formidable de connaître le taux d'erreur de zram.
Léo Léopold Hertz

Dans le cas de zram0, certaines statistiques sont disponibles dans / sys / block / zram0 dans les fichiers orig_data_size et compr_data_size . Je n'ai pas beaucoup de données échangées là-bas, mais pour ce qui est là, le rapport est d'environ 0,35. Avec ce ratio, 11 Go de données pourraient correspondre à 4 Go de RAM. Cela pourrait signifier que 7 Go de données ne sont pas échangés sur le disque.
JJ Hakala du

1
Vous pouvez placer des commandes de démarrage dans /etc/rc.local puissudo systemctl enable rc-local.service
JJ Hakala

J'ai découvert que cela zramne s'applique pas au swap sur disque dur / SSD, donc zramne s'applique pas ici, veuillez consulter le thread askubuntu.com/a/472227/25388
Léo Léopold Hertz

1

À utiliser zswapsi vous avez des parties d'échange sur disque dur / SSD. Le module zramest 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. Configuration zswapcomme 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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.