web-dev-qa-db-fra.com

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

Situation: correction des erreurs Out of Memory dans Matlab d'Ubuntu
Objectif: allouer de la mémoire virtuelle et/ou permuter sur un disque dur externe/SSD; la lecture/écriture diminue de 20 Go/s à 0,1 Go/s, ce qui est bien!
Terminologie: échange et mémoire virtuelle ici

Non, l'échange et la mémoire virtuelle sont complètement différents. Par exemple, le mappage en mémoire d'un fichier de 1 Go utilise 1 Go de mémoire virtuelle supplémentaire, mais l'utilisation du swap ne change pas. Swap est une forme de magasin de support. De nombreuses utilisations de la mémoire virtuelle n’ont rien à voir avec le stockage secondaire. (Et il y a eu des systèmes avec mémoire virtuelle et sans échange ainsi que des systèmes avec échange mais sans mémoire virtuelle.)

Le matériel grand public étant limité, je dois utiliser davantage de mémoire virtuelle et/ou permuter avec mes disques durs externes. Matlab dit à propos de la mémoire d'échange (TODO excluant la mémoire virtuelle?)

Systèmes Linux - Modifiez votre espace d'échange en utilisant les commandes mkswap et swapon.

Caractéristiques du système

  • Vous pouvez voir combien vous en avez par swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Les configurations de Matlab

    % 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
    
  • Donc, vous voyez que mon Matlab ne l'utilise pas. Je reçois des erreurs Out of Memory avec de grosses matrices dans Matlab. J'ai échoué dans reshape 'ing en matrices à vecteurs et en écriture de code parallèle. Je souhaite donc utiliser la mémoire virtuelle car je dois travailler; le taux n'a pas d'importance.

Pseudocode

  1. Script shell qui crée un échange, démarrez MATLAB et supprimez-le à la fermeture de MATLAB. ( MichaelHooreman )
  2. Activer l'échange sur le disque dur externe. Comment utiliser Sudo swapon -a ici?
  3. Commencez Matlab.
  4. Mettez Matlab utiliser le swap.
  5. Supprimer le swap à la sortie de Matlab.

Échange temporaire, exécution du client et fermeture/suppression de l'échange 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)
Scénario

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

Itération 1 avec Transcend 25M3 1 TB avec peu d’utilisation berofe où système_fichier 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. Lancer le client

    • L’historique des commandes a disparu au premier démarrage de Matlab dans la mémoire de swap (ticket n ° 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 les paramètres par défaut. La commande prefdir donne /home/masi/.matlab/R2016a qui est l'emplacement par défaut (/home/{username}/.matlab/R2016a. Le fichier /home/masi/.matlab/R2016a/matlab.prf existe après le redémarrage, here .

    • ... [autres erreurs] ...

  3. Fermer Matlab et taper à nouveau le mot de passe dans Terminal

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

Ouvrir: Comment appliquer la meilleure gestion des erreurs de trapping des erreurs ici? Voir mon script pour l'exemple dans la source. Thread Comment faire pour intercepter et écarter les erreurs si une erreur/un avertissement?

Permanent Swap = Séparer l'installation du client en cours d'exécution

Mise en place de swap

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

# 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

Système: Linux Ubuntu 16.04 64 bit
Noyau Linux: 4.6
Options du noyau Linux: wl
Matlab: 2016a
Documents officiels Matlab: Résoudre les erreurs "Mémoire insuffisante"
Disque dur externe: Transcend 1 TB StoreJet 25M3 test , Transcend 2 TB StoreJet 25M3
Système de fichiers HDD externe: ext4
Tampon de disque dur externe: 8 Mo
Discussions connexes: 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 une erreur de mémoire insuffisante dans Matlab? , Comment corriger une erreur de mémoire insuffisante dans Matlab pour une matrice 10800x10800? , Comment puis-je augmenter Limite de mémoire (contiguë et globale) dans Matlab r2012b? , Comment augmenter le bloc de tableau et résoudre les erreurs de mémoire insuffisante dans Matlab 2009b? , Comment résoudre ce problème Problème de mémoire pour une petite variable dans Matlab? , 'Mémoire insuffisante' dans Matlab. Une solution lente mais permanente?

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

  1. Comment appliquer la meilleure gestion des erreurs de trapping des erreurs ici? Voir mon script pour l'exemple dans la source. Fil Comment faire pour piéger les erreurs et les échanger en cas d'erreur/d'avertissement?.

Je n'aime pas du tout le concept de ce script. Le fait que vous ayez un disque dur externe que vous essayez d’utiliser comme swap n’est qu’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 d'échange ou achetez simplement un disque interne plus volumineux.

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

Fais juste le calcul. Si vous connaissez la taille de la matrice avant le début du programme, calculez la taille en Mo 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 sur IO via l'échange. Il s'agira simplement d'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 en itération (2)?

Vous pas. ce n'est pas parce que vous avez terminé le calcul que le système d'exploitation utilise les ressources que vous avez allouées. Lorsque vous aurez fini d'écrire pour échanger, cela libérera. Vous avez consommé tellement de mémoire que de nombreuses applications ne peuvent pas obtenir la mémoire dont elles ont besoin et utilisent donc le swap. Laissez-le simplement allumé et laissez le système d’exploitation le faire. Avant d'effectuer votre prochaine exécution, effacez les caches.

echo 3 > /proc/sys/vm/drop_caches 

Il y a probablement plus que cela, je ne suis pas un expert en Linux VM. Il serait intéressant d’examiner comment l’allocateur SLAB/SLUB fonctionne et comment l’adapter à vos besoins en mémoire. Vous pourrez peut-être mémoriser MLOCK matlab. Cela oblige le système d'exploitation à vous réserver de la mémoire, ou s'il ne démarre pas, vous devez également le déverrouiller lorsque vous avez terminé. Je peux très bien faire cela avec l'API C, mais je ne sais pas comment vous pourriez le faire en dehors d'un processus que je ne peux pas recompiler, ce qui nécessiterait des recherches.

Enfin, c’est le genre de choses pour lesquelles EC2 a été conçu. Il semble que vous ayez besoin de 16 Go, un m4.4xlarge a 64 Go de RAM à 0,958 USD par heure. C'est moins qu'une tasse de café. Écris ton installation de matlab en utilisant un sortilège juju ou similaire et transforme le tout en calcul en tant que service.

16G est 16 Go?

  • Oui, normalement, lorsque nous quittons le suffixe, nous entendons des nombres base2 en octets. Si vous voulez être concis, vous écririez 16GiB.

"J'ai besoin de matrices> 100 Go. Je ne sais pas si vous pouvez le faire avec EC2."

Devez-vous vider vos caches également par echo 3 > /proc/sys/vm/drop_caches?

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

Comment pouvez-vous MLOCK Matlab en mémoire?

  • man mlock. Bien que j'ai gaffé quand j'ai cité cela. Cet appel garantit que vous pouvez allouer toute la mémoire que vous souhaitez et que vous ne l'utiliserez pas, 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 l’idée de désactiver le swap en cas de défaillance du processus?

  • Je vais être franc, le concept de microgestion des fichiers d'échange de la manière que vous proposez est ridicule. Le système d'exploitation a pour tâche de gérer les ressources et de les distribuer de manière juste et cohérente. Une fois que vous lui donnerez plus de ressources, il les utilisera comme bon lui semble. Vous n'avez pas à le dire quand vous avez terminé et à retirer des ressources de dessous, le système d'exploitation vous dit quand c'est fait.

Lorsque je demande au système d'exploitation un espace d'adressage mémoire, parfois, il ne réussit pas toujours, cela ne signifie pas que je ne peux pas réessayer. Que matlab n'arrive pas à appeler Malloc deux fois, c'est le problème de Matlab.

Donc, pour modifier le changement souhaité, si ces 100 Go d’espace sont vraiment très chers , vous devez déterminer comment indiquer au système d’exploitation de: réduisez son empreinte mémoire (en effaçant les caches pour commencer) afin que le gestionnaire de mémoire ne ressente pas le besoin d'utiliser l'espace d'échange supplémentaire qui lui a été fourni. Alors et seulement alors, vous pourrez demander au gestionnaire de mémoire de libérer le fichier d'échange.

Il est facile de développer des éléments tels que la mémoire et les disques, il est beaucoup plus difficile de les réduire. La réduction oblige à rééquilibrer chaque utilisateur disposant de ressources allouées dans cet espace. Si à la place je disais "J'ai une matrice de stockage de 100 To mais maintenant je n'ai besoin que de 60 To, pourquoi est-ce que lorsque je supprime 40 To de disque, la matrice cesse de fonctionner?" Eh bien, la réponse serait évidente non?

Alors voici vos options comme je le vois.

  1. examinez l’API C matlab pour voir si vous pouvez mieux contrôler l’allocation de la mémoire pour ces ensembles de travail volumineux.

  2. refactoriser votre calcul pour calculer ce que vous avez maintenant en utilisant des sous-matrices ou une autre représentation de données fragmentée.

  3. écrivez votre propre programme en C/C++ en utilisant la pléthore de bibliothèques d'algèbre linéaire pour effectuer le calcul et utilisez malloc ou mmap anonymous pour allouer l'espace d'adressage dont vous avez besoin.

2
ppetraki

Vous ne pouvez pas dédier un échange pour un logiciel. Ce que vous pouvez faire est de créer un script shell qui crée un échange, démarrez MATLAB et supprimez-le à la fermeture 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 matlab), attend R quitte, démonte le fichier d'échange et le supprime.

Veuillez noter que: - vous aurez un avertissement car le fichier d'échange n'est pas la propriété de root. C'est parce que le système utilisera si pour tout logiciel, peut-être pas exécuté par vous, et vous pouvez lire sur ce fichier ... Je vous laisse réparer. - Si vous [ctrl] - [c] le script, la déconnexion, etc., l'échange restera monté. Je vous laisse 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}
12
Michael Hooreman

Je voudrais au moins tester l’efficacité de la compression RAM (module de noyau zram, disponible depuis la version 3.14 du noyau).

Suivant 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 compression RAM devrait être plus rapide que les E/S du disque.

Pour conserver les modifications également après le redémarrage, placez les commandes d'amorçage dans /etc/rc.local et exécutez Sudo systemctl enable rc-local.service.

1
J.J. Hakala

Voici comment vous pouvez étendre votre mémoire SWAP en utilisant un disque dur externe :

  • Commencez par écrire votre mémoire SWAP actuelle en exécutant:

    free -m
    
  • Deuxièmement, ayez sous la main le dossier de votre disque dur. Ce devrait être quelque chose comme /media/myhdd.

  • Décidez de la taille du SWAP supplémentaire que vous souhaitez ajouter. Disons que X GB.
  • Calculez la quantité d'octets que cette quantité est. En GB, cela correspond à: Y = X * 1024 ^ 3 , où Y est le résultat de votre calcul.
  • Choisissez la taille de bloc du fichier (en octets). Utilisons la valeur par défaut ici: 4096 (Plus d'informations à ce sujet ici ).
  • Calculez le nombre de blocs que le fichier aura: Z = Y/4096
  • Créez un fichier de taille X GB à 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 avec free -m


Nous pouvons configurer cela dans un script non interactif (Sudo pouvoirs requis):

#!/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: s'il vous plaît optimiser/corriger si possible. Comme dit, c'est mon premier script jamais :)

1
user308164

Utilisez zswap si vous avez des portions de swap sur le disque dur/SSD. Tho module zram ne contient pas de parties d'échange sur le disque dur/SSD, la réponse de Hakala n'est donc pas applicable. Voir le fil zram vs zswap vs zcache Guide ultime: quand utiliser lequel pour des explications. Configurez zswap comme décrit dans le fil 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"
    
  • Exécutez Sudo update-grub.