La variable swappiness permet de faire varier l’utilisation de la mémoire vive par rapport à la swap. Par défaut, cette variable est fixée à 60 sur une échelle qui va de 0 à 100.
Plus cette valeur est élevée plus le système va avoir tendance à swapper au détriment de l’utilisation de la mémoire vive.
Réduire cette valeur peut améliorer considérablement les performances du système.
Pour vérifier la valeur actuelle
cat /proc/sys/vm/swappiness
Dans mon cas j’ai décidé de mettre swappiness à , la commande suivante applique cette valeur instantanément
sysctl -w vm.swappiness=5
Pour quelle soit prise en compte lors du reboot de la machine, il faut créer un fichier dans /etc/sysctl.d
vi /etc/sysctl.d/swappiness.conf
et mettez dans ce fichier
vm.swappiness=5
Afin de décharger le contenu de la swap dans votre ram, il faut désactiver la swap puis la réactiver avec la commande suivante
swapoff -av && swapon -av
Vous pourrez suivre l’évolution dans un autre terminal soit avec la commande htop ou avec la commande suivante
watch free
Vous verrez se vider la swap et se remplir la ram jusqu’a plus soif
Pour afficher la swap en cours
swapon -s
Rajouter de la swap grâce à un fichier de swap. Nous allons créer un fichier de 2Go
dd if=/dev/zero of=/file.swap bs=1G count=2
Nous formatons ce fichier avec le système swap
mkswap -c /file.swap
Il est nécessaire de mettre les droits adéquates
chmod -v 600 /file.swap
On ajoute ce fichier à la swap de façon instantanée
swapon /file.swap
Pour supprimer ce fichier de la swap
swapoff /file.swap
Ca peut sembler bizarre mais on peut utiliser la RAM pour y stocker un fichier de swap.
Tout d’abord, vérifier le device loop disponible
#losetup -f /dev/loop0
Créer un fichier dans la RAM
cd /dev/shm dd if=/dev/zero of=/dev/shm/file.swap bs=1024 count=4096000
On associe le fichier au device loop
losetup /dev/loop0 /dev/shm/file.swap
On formate notre device
mkswap /dev/loop0
On monte le device en swap
swapon /dev/loop0
Pour vérifier
swapon -s
Commande pour vider le cache de la mémoire
echo 3 > /proc/sys/vm/drop_caches
Ligne de commande à adapter si besoin
for file in /proc/*/status ; do awk '/^(VmSwap|Pid|Name)/{printf "%30s%s",$2,$3}END{ print ""}' $file; done | sort -k3 -h
Avec des tabulations comme séparateur
for file in /proc/*/status ; do awk '/^(VmSwap|Pid|Name)/{printf $2 "" $3 "\t"}END{ print ""}' $file; done | sort -t$'\t' -k3 -h
Une variante qui permet de récupérer l’Uid et de le résoudre pour avoir le nom de l’utilisateur
for file in /proc/*/status ; do awk '/^(VmSwap|Uid|Pid|Name)/{if($1=="Uid:"){ system("echo -n $(id -nu " $2")"); printf "\t";} else printf $2 "" $3 "\t"}END{ print ""}' $file; done | sort -t$'\t' -k4 -h
Utilisez ce script ⇒ https://github.com/hoytech/vmtouch
vmtouch permet d’afficher si un fichier ou plusieurs sont stocké en ram. Il permet aussi de forcer un fichier à se mettre en ram plus tout un tas d’options ⇒ https://github.com/hoytech/vmtouch/blob/master/vmtouch.pod
Exemple, ici on voit que le fichier n’est pas en cache
[root@xt ~]# vmtouch -v /usr/local/var/orca/procallator.cfg /usr/local/var/orca/procallator.cfg [ ] 0/5 Files: 1 Directories: 0 Resident Pages: 0/5 0/20K 0% Elapsed: 0.000215 seconds
Maintenant, on peut le forcer à se mettre en cache
[root@xt ~]# vmtouch -vt /usr/local/var/orca/procallator.cfg /usr/local/var/orca/procallator.cfg [OOOOO] 5/5 Files: 1 Directories: 0 Touched Pages: 5 (20K) Elapsed: 0.005313 seconds
On vérifie
[root@xt ~]# vmtouch -v /usr/local/var/orca/procallator.cfg /usr/local/var/orca/procallator.cfg [OOOOO] 5/5 Files: 1 Directories: 0 Resident Pages: 5/5 20K/20K 100% Elapsed: 0.000241 seconds
Commande pour afficher la liste des fichiers d’un répertoire qui sont en RAM
vmtouch -v * | grep -B 1 "^.\[.*[^ 0]/"
Ou au contraire qui ne sont pas en RAM
vmtouch -v * | grep -B 1 "^.\[.* 0/"