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
- 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)
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
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.
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)
- # mkdir /mnt/{ramfs,tmpfs}
- # mount -t ramfs -o size=300m ramfs /mnt/ramfs
- # mount -t tmpfs -o size=300m tmpfs /mnt/tmpfs
- 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)
- 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)
- ajouter dans /etc/fstab:
- tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
- # mount -a (ou rebooter)
Créer un fichier ramdisk utilisable par tous les users
- # mkdir /tmp/ma_ramdisk && chmod 1777 /tmp/ma_ramdisk
- Ajouter dans /etc/fstab :
- tmpfs /tmp/ma_ramdisk tmpfs nodev,noexec,nosuid 0 0
- # mount -a (ou rebooter)
Pour que Firefox utilise un de ces dossiers ramdisk, l'indiquer (par about:config) dans browser.cache.disk.parent_directory
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
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
- $ sudo dd if=/dev/zero of=/fichierswap bs=512M count=1 (un bloc de 512 Mo)
- ou : $ sudo dd if=/dev/zero of=/fichierswap bs=1024 count=524288 (524 288 blocs de 1024 octets)
- $ sudo chown root:root /fichierswap ; sudo chmod 0600 /fichierswap
- $ 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
|