Linux - Mémoire

Huge pages
Mémoire
Mémoire partagée (shm - shared memory)
Mémoire virtuelle
Paramètres noyau
RAM Containers (ramfs, tmpfs)
Swap

Mémoire

Linux utilise le maximum de mémoire, celle qui n'est pas utilisée par les processus peut être utilisé par des buffers et des caches (voir le résultat des commande free et vmstat, et voir page cache).

Mémoire virtuelle = RAM + swap.

Articles, docs

Outils, logiciels

Vérif

  • Moniteur système → sélectionner un processus → Affichage → Cartes de la mémoire (VM, etc.) ou Fichiers ouverts
  • collectl (remplace avantageusement vmstat et sar)

Alertes

Commandes

  • Configuration système & infos
    • Infos : # ulimit -a   (max locked memory, max memory size, virtual memory)
  • Infos sur l'utilisation mémoire
    • # vmstat(8)
      • mémoire libre : colonnes free, buff, et cache
      • utilisation dyn. de la swap : colonnes si et so (si = swap in = transferts de la swap vers la mémoire vive, et so = swap out = l'inverse)
    • sar(1), lvmsar --- tutoriel
    • # cat /proc/iomem
  • Infos sur la mémoire & les zones mémoire High & Low (appelée aussi "Normal")
    • dynamiquement
      • # watch -n 1 -d free -l
    • ponctuellement
      • # cat /proc/meminfo (infos mémoire détaillées)
      • # free -l   (la ligne "-/+ buffers/cache" indique réellement la mémoire libre, hors buffers et caches)
  • Infos sur la fragmentation mémoire
    • vérification
      • # egrep 'Normal|HighMem' /var/log/messages
    • vérification ponctuelle
      • # echo m > /proc/sysrq-trigger ; egrep 'Normal|HighMem' /var/log/messages | tail -2
      • # cat /proc/buddyinfo
  • Infos sur l'utilisation mémoire et les "page fault" (un "page fault" entraîne une gestion de bloc mémoire)
  • Infos sur la mémoire utilisée par un processus
    • # top
    • # ps (exemples & mes infos)
    • # pmap le_pid_du_processus
    • # pmap -d le_pid_du_processus
    • # pmap -x le_pid_du_processus
  • Infos sur la mémoire que pourra occuper un binaire
    • # size le_binaire (-A = affichage style SYS V, et -B = style BSD)
  • Infos sur la taille de la page mémoire (pagesize)
    • $ getconf PAGE_SIZE    (4096 octets pour les microprocesseurs de la famille x86)

Mémoire partagée (shm - shared memory) - fait partie des IPC Unix System V

ipcs

Vérification de l'utilisation des ressources : $ ipcs -a (ou : ipcs --all).
Vérification des limites : $ ipcs -lm   (-m : segments de shared memory)

Shared memory

$ ipcs -am   (--bytes, ou : --human)

Vérification des valeurs shm configurées au niveau noyau :
  • $ sysctl -a | grep shm
  • $ for  i  in `ls /proc/sys/kernel/shm*` ;  do  echo $i ; cat $i  ;  done

shmall

Nombre total de pages de mémoire partagée.

$ cat /proc/sys/kernel/shmall   (en général : 2097152)

Recommandation : shmall = taille de la mémoire physique / taille de la page mémoire

shmmni

Nombre total de segments de mémoire partagée pouvant être créés.

shmmax

Taille max (en octets) du segment de mémoire partagée pouvant être créé.

Recommandation : shmmax = taille de la mémoire physique / 2

Exemples

RAM Containers (ram disk, RAMdisk)

Tutos : fr (config noyau, rsync, etc), fr, angl (test perf), angl (mound --bind), angl (SSD)

  1. # mkdir /mnt/{ramfs,tmpfs}
    1. # mount -t ramfs -o size=300m ramfs /mnt/ramfs
    1. # mount -t tmpfs -o size=300m tmpfs /mnt/tmpfs
  2. ou : # mount mon_tmpfs /dev/shm -t tmpfs -o size=2g

ramfs

  • non borné (débordement possible en écriture, mais crash ou pb à la relecture)
  • pas swappable
  • vu par mount, mais pas par df
  • variante compressée : cramfs

tmpfs (anciennement shmfs), dérivé de ramfs

  • borné (définir une taille => erreur "No space left on device" quand le tmpfs est plein)
  • swappable si RAM vient à manquer
  • vu par mount et par df
  • config

Remplacer /tmp (et /var/tmp) par des fichiers ramdisk (utile pour la sécurité et pour les SSD)

  1. mount tmpfs /tmp -t tmpfs -o size=300m
    • l'ancien contenu de /tmp est masqué jusqu'au umount, sauf pour les processus ayant ouvert des fichiers sous /tmp avant ce mount (qui ont toujours accès à leurs fichiers)
  1. ajouter dans /etc/fstab:
    1. tmpfs   /tmp   tmpfs   defaults,noatime,mode=1777   0   0
  2. # mount -a (ou rebooter)

Créer un fichier ramdisk utilisable par tous les users

  1. # mkdir /tmp/ma_ramdisk && chmod 1777 /tmp/ma_ramdisk
  2. Ajouter dans /etc/fstab :
    • tmpfs   /tmp/ma_ramdisk   tmpfs   nodev,noexec,nosuid   0   0
  3. # mount -a (ou rebooter)

Pour que Firefox utilise un de ces dossiers ramdisk, l'indiquer (par about:config) dans browser.cache.disk.parent_directory

Mémoire virtuelle

Articles

Doc

  • /usr/src/linux-source-3.2.0/Documentation/vm   (Ubuntu)

Commandes

  • Configuration système & infos
    • Infos : # ulimit -a   (max locked memory, max memory size, virtual memory)
    • Ex., configurer la taille max de la mémoire virtuelle : # ulimit -v unlimited

Memory overcommit

Depuis Linux 2.4, du fait du "memory overcommit", un processus peut recevoir une erreur d'allocation mémoire, ou être tué par OOM Killer si un OOM (Out Of Memory) se produit.

Pour pouvoir se connecter par SSH, sshd peut être protégé de OOM Killer par :
echo -17 > /proc/pid_de_sshd/oom_adj

Doc

  • /usr/src/linux-source-3.2.0/Documentation/vm/overcommit-accounting   (Ubuntu)
  • Doc PostgreSQL fr : 9.2, 7.4

Config

  • par sysctl ou dans /etc/sysctl.conf
    • vm.overcommit_memory
    • vm.overcommit_ratio

Vérif

  • # cat /proc/meminfo |grep Commit

Huge pages

Les Huge pages entraînent moins de page fault et moins de translations d'adresse virtuelle vers adresse physique.
Le noyau utilise des Huge Pages.

Au niveau userspace

Par défaut, la mémoire est gérée par blocs (pages) de 4096 octets, et ce, sur la plupart des architectures (vérification par : "getconf PAGESIZE" ou par un programme C). Les pages de taille plus importante sont appelées "Huge pages".

Articles

swap, swappiness

Linux n'effectue pas de "swapping", Linux pagine dans l'espace d'échange (la swap).

Le fichier de swap (sur SSD, disque dur, carte SD, etc.) va servir de cache pour les pages mémoire rarement utilisées, ce qui permet de libérer de la mémoire pour les processus les plus actifs.

Articles, doc

Swappiness : taux mémoire de déclenchement de la pagination (taux qui peut être modifié en cas de besoin)

Si le % de mémoire libre descend en dessous du % indiqué par : cat /proc/sys/vm/swappiness (par défaut : 60), Linux commencera à paginer dans la swap.

Pour que le s.e. commence à paginer dans la swap quand il ne reste plus que 10 % de mém. libre :
  • modif temporaire : $ sudo sysctl vm.swappiness=10
  • modif permanente (reboot) : configurer "vm.swappiness = 10" dans /etc/sysctl.conf et rebooter

Pour éviter de swapper trop rapidement (par exemple en cas de backup d'un fichier de plusieurs Go), positionner "vm.swapiness=0" dans /etc/sysctl.conf (par défaut, sa valeur est à 60). Ainsi, lorsque toute la mémoire sera utilisée, Linux réduira le cache fichiers plutôt que de swapper ; quand cela ne sera plus possible, il utilisera le mécanisme de swap. Cela peut éviter que OOM Killer se déclenche trop rapidement...

Exemple d'ajout de fichier de swap

Création et activation manuelle d'un fichier swap de 512 Mo

  1. $ sudo dd if=/dev/zero of=/fichierswap bs=512M count=1 (un bloc de 512 Mo)
    1. ou : $ sudo dd if=/dev/zero of=/fichierswap bs=1024 count=524288 (524 288 blocs de 1024 octets)
  2. $ sudo chown root:root /fichierswap ; sudo chmod 0600 /fichierswap
  3. $ sudo mkswap /fichierswap ; sudo swapon /fichierswap

Vérification

  • $ free -tm (affiche la RAM + la swap, ou "free", ou "free -m", m pour afficher en Mo)
  • $ swapon -s (ou : cat /proc/swaps)
  • $ grep -i --color swap /proc/meminfo
  • $ top, etc

Pour que cette swap soit activée automatiquement au démarrage, il faut avoir dans /etc/fstab :

/fichierswap   none   swap   sw            0   0                 (pour Ubuntu)
/fichierswap   swap   swap   defaults   0   0                 (pour RHEL)

et avoir exécuté : sudo swapon -a

Pour désactiver cette swap

  • $ sudo swapoff /fichierswap
  • $ sudo swapoff -av

Vic
Page modifiée le 26 janvier 2023

Page d'accueil du site