Skip to content


Connaître les processus en swap d'une machine Linux + petit bonus (valeur RAM -> SWAP, Vidage du cache, La gestion préventive de la mémoire)

I) Introduction

Sur une machine d'un client de l'entreprise pour laquelle je travaille, j'ai eu à connaître les processus qui utilisaient la swap du serveur.
C'est une problématique simple, évidente, récurrente mais pourtant la réponse ne l'est pas ! En effet autant nous pouvons connaître le niveau de swap utilisé avec un top htop...
Mais comment énumérer les processus qui s'y trouvent ou bien l'utilisent... ?

C'est en me posant cette question que la réponse m'a été donné sur ce blog : http://northernmost.org/blog/find-out-what-is-using-your-swap/

II) La solution de Erik Ljungstrom

La solution de Erik Ljungstrom est un script bash et voici celui-ci

#!/bin/bash
# Get current swap usage for all running processes
# Erik Ljungstrom 27/05/2011
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` ; do
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
let OVERALL=$OVERALL+$SUM
SUM=0
 
done
echo "Overall swap used: $OVERALL"

 

un

chmod +x script.sh

Puis on exécute :

sh script.sh | sort -n -k 5| egrep -v "Swap used: 0"

Cela donne :

# ./pid-swap.sh | sort -n -k 5| egrep -v "Swap used: 0"
Overall swap used: 40644
PID=2157 - Swap used: 36 - (start_kdeinit )
PID=1094 - Swap used: 44 - (portmap )
PID=2208 - Swap used: 60 - (kwrapper4 )
PID=1431 - Swap used: 64 - (hald-runner )
PID=1 - Swap used: 64 - (init )
PID=2085 - Swap used: 64 - (dbus-daemon )
PID=1470 - Swap used: 68 - (hald-addon-stor )
PID=1471 - Swap used: 68 - (hald-addon-stor )
PID=2120 - Swap used: 68 - (getty )
PID=2123 - Swap used: 68 - (getty )
PID=2119 - Swap used: 72 - (getty )
PID=2121 - Swap used: 76 - (getty )
PID=2122 - Swap used: 76 - (getty )
PID=2124 - Swap used: 76 - (getty )
PID=1396 - Swap used: 80 - (acpid )
PID=2022 - Swap used: 84 - (x-session-manag )
PID=1454 - Swap used: 92 - (hald-addon-inpu )
PID=1403 - Swap used: 100 - (dbus-daemon )
PID=1430 - Swap used: 104 - (hald )
PID=2244 - Swap used: 108 - (polkitd )
PID=1488 - Swap used: 112 - (atd )
PID=1517 - Swap used: 128 - (kdm )
PID=1106 - Swap used: 132 - (rpc.statd )
PID=1569 - Swap used: 136 - (cron )
PID=1455 - Swap used: 140 - (hald-addon-rfki )
PID=1512 - Swap used: 140 - (avahi-daemon )
PID=1473 - Swap used: 156 - (hald-addon-acpi )
PID=2077 - Swap used: 176 - (ssh-agent )
PID=1521 - Swap used: 184 - (avahi-daemon )
PID=1882 - Swap used: 220 - (kerneloops )
PID=2080 - Swap used: 244 - (dbus-launch )
PID=1869 - Swap used: 264 - (exim4 )
PID=2039 - Swap used: 288 - (sshd )
PID=2241 - Swap used: 296 - (yakuake )
PID=1887 - Swap used: 344 - (kdm )
PID=1377 - Swap used: 352 - (rsyslogd )
PID=7397 - Swap used: 456 - (udevd )
PID=7396 - Swap used: 460 - (udevd )
PID=1609 - Swap used: 508 - (cupsd )
PID=1917 - Swap used: 556 - (console-kit-dae )
PID=307 - Swap used: 576 - (udevd )
PID=2442 - Swap used: 744 - (java )
PID=2216 - Swap used: 1176 - (knotify4 )
PID=2239 - Swap used: 1220 - (polkit-kde-auth )
PID=2232 - Swap used: 1232 - (nepomukserver )
PID=2222 - Swap used: 1364 - (kaccess )
PID=2159 - Swap used: 1452 - (klauncher )
PID=11844 - Swap used: 1696 - (kio_file )
PID=2158 - Swap used: 1816 - (kdeinit4 )
PID=2213 - Swap used: 1972 - (kglobalaccel )
PID=2161 - Swap used: 2168 - (kded4 )
PID=2209 - Swap used: 2304 - (ksmserver )
PID=2233 - Swap used: 2516 - (krunner )
PID=2211 - Swap used: 2668 - (kwin )
PID=2237 - Swap used: 3116 - (kmix )
PID=2217 - Swap used: 3264 - (plasma-desktop )
PID=1568 - Swap used: 4596 - (Xorg )

 

III) Connaître la valeur indiquant de mettre en SWAP

Connaissez-vous l'indicateur ou le paramètre qui fait que votre noyaux GNU/Linux met tel ou tel processus en SWAP ou pas ? Non !?
En réalité, la décision que prend votre système de mettre ou non en SWAP dépend du % de la mémoire vive utilisée ! La plupart des Linux ont comme valeur 40.
C'est à dire que lorsque il ne reste que 60% de votre RAM alors il met en SWAP les processus naissants !

Ce paramètre s'appelle le "swappiness" et sa valeur est visible par la commande :

cat /proc/sys/vm/swappiness
60

Pour changer cette valeur deux solutions une qui sera perdue au redémarrage et l'autre s'appliquant au démarrage....
La première méthode est de faire

echo "10" > /proc/sys/vm/swappiness
mais celle-ci sera écrasée par celle définie par défaut au démarrage : 40
La seconde méthode est d'éditer /etc/sysctl.conf et de mettre
vm.swappiness = 10
dans celui-ci

C'est d'ailleurs la méthode et la valeur que j'utilise pour ma petite machine serveur web, mail, etc.

Pour ma machine personnelle, mon poste j'ai mis :

vm.swappiness = 0

Après avoir enregistré les changements il faut appliquer ceux-ci bien entendu !
La commande

sysctl -p
appliquera tous les changements de ce fichier !

Il faut réactiver la SWAP pour que les changement soient effectifs :

swapoff -av && swapon -av
swapoff sur /dev/sda2
swapon sur /dev/sda2

IV) Vidage du cache

Un autre paramètre intéressant à étudier est : vm.drop_cache, celui-ci gère le fait que votre noyaux vide le cache des données accédées récemment ou non. Quatre valeurs sont possibles :

  • drop_cache = 0 (le cache n'est pas vidé)

 

  • drop_cache = 1 (libère le pagecache)

 

  • drop_cache = 2 (libère dentries et inodes)

 

  • drop_cache = 3 (libère le pagecahce, dentries et inodes)

 

Ce paramètre se trouve dans /etc/sysctl.conf :

vm.drop_caches = N

 

V) La gestion préventive de la mémoire

Dans la documentation : http://www.mjmwired.net/kernel/Documentation/sysctl/vm.txt#543

543	overcommit_memory:
544
545	This value contains a flag that enables memory overcommitment.
546
547	When this flag is 0, the kernel attempts to estimate the amount
548	of free memory left when userspace requests more memory.
549
550	When this flag is 1, the kernel pretends there is always enough
551	memory until it actually runs out.
552
553	When this flag is 2, the kernel uses a "never overcommit"
554	policy that attempts to prevent any overcommit of memory.
555
556	This feature can be very useful because there are a lot of
557	programs that malloc() huge amounts of memory "just-in-case"
558	and don't use much of it.
559
560	The default value is 0.
561
562	See Documentation/vm/overcommit-accounting and
563	security/commoncap.c::cap_vm_enough_memory() for more information.
Ce paramètre souvent à 0 , peut-être changé en indiquant :
vm.overcommit_memory = n
dans le fichier sysctl.conf
Je l'ai passé à 2, ce qui empêche les :
...
Jan 28 00:52:58 box kernel: [15199.058126] mysqld invoked oom-killer: gfp_mask=0x44d0, order=2, oomkilladj=0
Jan 28 00:52:58 box kernel: [15199.058145] Pid: 5572, comm: mysqld Not tainted 2.6.28-17-generic #58-Ubuntu
Jan 28 00:52:58 box kernel: [15199.058158] Call Trace:
Jan 28 00:52:58 box kernel: [15199.058183]  [] ? printk+0x18/0x1a
Jan 28 00:52:58 box kernel: [15199.058204]  [] oom_kill_process+0x75/0x210
Jan 28 00:52:58 box kernel: [15199.058222]  [] ? select_bad_process+0xc3/0x100
Jan 28 00:52:58 box kernel: [15199.058239]  [] out_of_memory+0xa2/0x140
Cependant lorsque le paramètre est à 2 , il faut indiquer un % de taille :
http://www.mjmwired.net/kernel/Documentation/sysctl/vm.txt#567
avec le paramètre suivant :
vm.overcommit_ratio = 50
Ce qui donne au global :
# Gestion préventive de la mémoire
# default : vm.overcommit_memory = 0
vm.overcommit_memory = 2
vm.overcommit_ratio = 50
Appliquez vos changements :
sysctl -p

Voilà, amusez vous bien à cache-cache ! 🙂

- Fin -

Print Friendly, PDF & Email

Posted in Debian, Important, Linux, Mandriva, Technique, Toutes. Tagged with , , , , , .

5 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Victor said

    Hello
    Un grand merci vraiment pour ce post, qui a sauvé mon serveur ! (enfin en tout cas, qui me l'a méchamment accéléré)
    Lui qui avec 24Go de mémoire passait tout en swap et saturait son 1Go de swap de manière proprement stupide...

    Merci à vous 🙂

  2. admin said

    🙂

  3. Flamme said

    Bonjour.
    Merci beaucoup, cela m'a bien dépanné moi aussi.

    Bonne continuation.

  4. tisc0 said

    Génial ! Merci !

  5. olivier-network said

    Merci pour cette solution claire et détaillée

Some HTML is OK

(required)

(required, but never shared)

or, reply to this post via trackback.

Time limit is exhausted. Please reload CAPTCHA.


/* */
Creative Commons License
Cette création par Laurent Besson est mise à disposition selon les termes de la licence Creative Commons Paternité-Partage des Conditions Initiales à l'Identique 2.0 France.