J'ai un serveur Linux virtuel (Fedora 17) avec 28 Go de RAM et 2 Go de swap. Le serveur exécute une base de données MySQL configurée pour utiliser la majeure partie de la RAM.
Après un certain temps, le serveur commence à utiliser swap pour échanger les pages non publiées. C'est très bien car mon swappiness est à 60 par défaut et c'est le comportement attendu.
Ce qui est étrange, c'est que le nombre dans top / meminfo ne correspond pas aux informations des processus. C'est-à-dire que le serveur rapporte ces chiffres:
/proc/meminfo:
SwapCached: 24588 kB
SwapTotal: 2097148 kB
SwapFree: 865912 kB
top:
Mem: 28189800k total, 27583776k used, 606024k free, 163452k buffers
Swap: 2097148k total, 1231512k used, 865636k free, 6554356k cached
Si j'utilise le script de /server//a/423603/98204, il rapporte des nombres raisonnables (quelques Mo échangés par bash'es, systemd, etc.) et une grosse allocation de MySQL (j'ai omis beaucoup de lignes de sortie ):
892 [2442] qmgr -l -t fifo -u
896 [2412] /usr/libexec/postfix/master
904 [28382] mysql -u root
976 [27559] -bash
984 [27637] -bash
992 [27931] SCREEN
1000 [27932] /bin/bash
1192 [27558] sshd: admin@pts/0
1196 [27556] sshd: admin [priv]
1244 [1] /usr/lib/systemd/systemd
9444 [26626] /usr/bin/perl /bin/innotop
413852 [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264 Total Swap Used
Donc, si j'obtiens la sortie de script correctement, l'utilisation totale du swap devrait être de 449264K = ca. 440 Mo avec mysql en utilisant ca. 90% du swap.
La question est de savoir pourquoi cela diffère tellement des chiffres supérieurs et meminfo? Existe-t-il un moyen de "vider" les informations de swap pour voir ce qui s'y trouve réellement au lieu de résumer les utilisations de swap de tous les processus?
Lors de l'analyse du problème, j'ai proposé différentes idées, mais elles semblent toutes fausses:
- La sortie du script n'est pas en Ko. Même si ce serait en unités de 512 ou 4 Ko, cela ne correspondra pas. En fait, le rapport (1200: 440) est d'environ 3: 1, ce qui est un nombre "étrange".
- Il y a quelques pages dans swap qui sont en quelque sorte partagées entre les processus comme mentionné dans /server//a/477664/98204 . Si cela est vrai, comment puis-je trouver le nombre réel de mémoire utilisé comme ça? Je veux dire qu'il faudrait faire une différence d'environ 800 Mo. Et cela ne sonne pas juste dans ce scénario.
- Il y a quelques "anciennes" pages dans swap utilisées par des processus déjà terminés. Cela ne me dérangerait pas que si je pouvais savoir combien coûte ce swap "libre".
- Il y a des pages de swap qui ont été remises en mémoire et qui sont en swap juste au cas où elles n'ont pas changé dans la RAM et doivent être à nouveau swappées comme mentionné dans /server//a/100636/98204 . Mais la valeur SwapCached n'est que de 24 Mo.
Ce qui est étrange, c'est que l'utilisation du swap augmente lentement alors que la somme de sortie du script est à peu près la même. Au cours des 3 derniers jours, le swap utilisé est passé de 1100 Mo à 1230 Mo actuel tandis que la somme est passée de 430 Mo à 449 Mo actuel (ca.).
Le serveur dispose de suffisamment de RAM (capable) pour que je puisse simplement désactiver le swap et le réactiver. Ou je pourrais probablement définir le swappiness à 0 afin que le swap ne soit utilisé que s'il n'y a pas d'autre moyen. Mais je voudrais résoudre le problème ou au moins découvrir quelle en est la cause.
Réponses:
Fedora 18 et plus ont
smem
dans les dépôts. Vous pouvez télécharger le script python et l'installer à partir des sources .Voici un exemple de sortie (quelque peu coupée et anonymisée) de ma machine:
La source fournit également
smemcap
qui stockera toutes les données pertinentes afin que smem puisse y être exécuté plus tard.la source
Vous devriez vérifier ce script sur une autre machine, car mon système affiche une utilisation de swap correcte:
Très proche 111280 ~ = 120368.
Regardez également ce script:
De ce fil:
/unix/71714/linux-total-swap-used-swap-used-by-processes
la source