comment vérifier ce qui est en swap?

15

Sur mon système, j'ai une certaine quantité de swap utilisée:

undefine@uml:~$ free
             total       used       free     shared    buffers     cached
Mem:      16109684   15848264     261420     633496      48668    6096984
-/+ buffers/cache:    9702612    6407072
Swap:     15622140        604   15621536

Comment vérifier ce qui est en swap?

J'essaie de le vérifier via des processus, mais pour chaque pid sur le système, VmSwap est 0:

undefine@uml:~$ awk '/VmSwap/ {print $2}' /proc/*/status |uniq
0

Quoi d'autre peut être échangé? J'ai pensé à tmpfs - mais j'ai relu tous les fichiers sur tmpfs-es - et il ne vide pas la taille du swap.


indéfinir
la source

Réponses:

9

smemest l'outil standard pour cela. C'est propre et simple.

Sur un système basé sur Debian, installez-le via le gestionnaire de paquets:

 sudo apt-get install smem

Un échantillon (écrêté) de sortie de mon système:

$ smem -s swap -t -k -n
  PID User     Command                         Swap      USS      PSS      RSS 
  831 1000     /bin/bash                          0     3.8M     3.8M     5.5M 
 3931 1000     bash /usr/bin/sage -c noteb   276.0K     4.0K    20.0K     1.2M 
17201 1000     /usr/bin/dbus-launch --exit   284.0K     4.0K     8.0K   500.0K 
17282 1000     /usr/bin/mate-settings-daem   372.0K    11.0M    11.7M    21.8M 
17284 1000     marco                         432.0K    16.7M    18.1M    29.5M 
17053 1000     mate-session                  952.0K     3.3M     3.5M     9.2M 
 3972 1000     python /usr/lib/sagemath/sr     2.7M   101.8M   102.1M   104.3M 
-------------------------------------------------------------------------------
  141 1                                        5.2M     3.9G     4.0G     4.5G 
shivams
la source
6
Mais renvoie-t-il autre chose que la valeur indiquée dans la VmSwapligne /proc/PID/status? La question n'est pas de demander un affichage plus joli, c'est de demander ce qui pourrait être en échange autre que les données de processus.
Gilles 'SO- arrête d'être méchant'
1
smem ne me donne rien de plus utile que greping proc: undefine @ uml: ~ $ sudo smem -c swap | uniq -c 1 Swap 227 0
undefine
2

Je n'ai commencé à y réfléchir qu'hier pour mes besoins, voici ce que j'ai trouvé jusqu'à présent:

SWAP_USED = Used_by_Processes + SwapCached + Part_of_Tmpfs + something_else

Histoire courte:

Used_by_Processes - données qui ont été complètement échangées de la mémoire.

SwapCached - données qui ont été échangées sur le disque, mais qui restent toujours en mémoire.

Part_of_Tmpfs - une partie des données tmpfs.

Longue histoire:

Used_by_Processes - il existe de nombreuses instructions publiées sur la façon de mal calculer celui-ci;) Par exemple, si nous résumons toutes les VmSwapentrées de /proc/*/statusou les Swapentrées de /proc/*/smaps- nous obtiendrons une surestimation (les pages échangées partagées pourraient être comptées plus d'une fois). Si nous ne l'exécutons pas depuis l' rootutilisateur ou notre système d'exploitation - la sous-estimation sera retournée en silence. Je n'ai pas de moyen approprié d'identifier les pages partagées, mais les éclaboussures des mêmes `` cartes '' donnent une bien meilleure approximation que les autres approches: (notez que catci - dessous n'est pas inutile et nécessite en fait une 2>/dev/null)

[root@a:~]# cat /proc/*/status|awk '      /^VmSwap/{           s+=$2       }END{print s}'
32048
[root@a:~]# cat /proc/*/smaps|awk '         /^Swap/{           s+=$2       }END{print s}'
32048
[root@a:~]# cat /proc/*/smaps|awk '/-/{r=$0}/^Swap/{if(R[r]!=1)s+=$2;R[r]=1}END{print s}'
14940
[root@a:~]# free -k|grep -e Swap -e used
             total       used       free     shared    buffers     cached
Swap:      8388600      15508    8373092

SwapCached - celui-ci est simple et peut être extrait proprement /proc/meminfo. Certaines personnes ne s'attendraient pas à ce que cela soit considéré comme un échange "utilisé", car une copie en double (non sale) de la même page dans la RAM et le swap peut être libérée de chaque côté assez instantanément (au cas où la demande viendrait), ce qui rend l'un des exemplaires "libérés".

Part_of_Tmpfs - le côté positif est que lorsque toutes vos données tmpfs sont intactes pendant plusieurs jours et swappinessnon nulles - il est fort probable que des tmpfs entiers soient échangés (et vice versa pour les données récemment utilisées). L'inconvénient est que je n'ai trouvé aucune API pour calculer de manière fiable le seuil ou le pourcentage de la quantité échangée, bien que s'il y a suffisamment de RAM - nous pouvons copier des données tmpfs entières /dev/nullet obtenir ainsi un indice de la quantité échangée.

Les erreurs courantes commises lors du calcul de la taille de tmpfs sont - en supposant que ce /dev/shmsoit le seul tmpfs configuré ou en essayant de le faire par une analyse récursive par fichier (non seulement les implémentations ont tendance à omettre les fichiers cachés ou à le faire à partir de non root, mais elles se déséchangent également) quelques pages pendant la traversée). La manière la plus simple est d'utiliser du bon vieux df.

something_else - voir le " diff 385 MB" ci-dessous, a besoin d'une plongée dans les sources du noyau. Voir mon script:

#!/bin/bash
TMPFS=`df -kP           |awk '          /^tmpfs/{          s+=$3       }END{print int( s/1024)}'`
PROCS=`cat /proc/*/smaps|awk '/-/{r=$0} /^Swap/{if(R[r]!=1)s+=$2;R[r]=1}END{print int( s/1024)}'`
SCACH=`cat /proc/meminfo|awk '          /^SwapCached/                      {print int($2/1024)}'`
TOTAL=`free -k          |awk '          /^Swap/                            {print int($3/1024)}'`
echo  -e " df $TMPFS\t    smaps $PROCS \tSwapCache $SCACH\t| $TOTAL\tswap | diff $[TOTAL-TMPFS-PROCS-SCACH]\tMB"

et la sortie de différentes cases:

xa002:   df 0       smaps 271   SwapCache 3858  | 4120  swap | diff -9  MB
sg003:   df 0       smaps 234   SwapCache 3876  | 4111  swap | diff 1   MB
sg001:   df 0       smaps 245   SwapCache 3845  | 4093  swap | diff 3   MB
sg002:   df 0       smaps 244   SwapCache 3843  | 4091  swap | diff 4   MB
dm001:   df 2       smaps 971   SwapCache 728   | 1707  swap | diff 6   MB
hm012:   df 270     smaps 161   SwapCache 29    | 454   swap | diff -6  MB
hm003:   df 274     smaps 142   SwapCache 27    | 440   swap | diff -3  MB
hm006:   df 262     smaps 150   SwapCache 29    | 437   swap | diff -4  MB
hm002:   df 265     smaps 120   SwapCache 28    | 412   swap | diff -1  MB
hm009:   df 258     smaps 124   SwapCache 33    | 410   swap | diff -5  MB
hm011:   df 262     smaps 118   SwapCache 28    | 406   swap | diff -2  MB
hm008:   df 245     smaps 122   SwapCache 32    | 396   swap | diff -3  MB
hm005:   df 247     smaps 120   SwapCache 33    | 396   swap | diff -4  MB
dp001:   df 0       smaps 0     SwapCache 0     | 386   swap | diff 386 MB
hm014:   df 184     smaps 134   SwapCache 34    | 343   swap | diff -9  MB
hm007:   df 0       smaps 132   SwapCache 32    | 158   swap | diff -6  MB
bm002:   df 0       smaps 121   SwapCache 25    | 141   swap | diff -5  MB
dm002:   df 2       smaps 70    SwapCache 71    | 139   swap | diff -4  MB
bm001:   df 3       smaps 102   SwapCache 28    | 131   swap | diff -2  MB
bm004:   df 0       smaps 98    SwapCache 29    | 126   swap | diff -1  MB
hm013:   df 0       smaps 100   SwapCache 30    | 124   swap | diff -6  MB
bm006:   df 0       smaps 103   SwapCache 15    | 122   swap | diff 4   MB
hm010:   df 0       smaps 102   SwapCache 24    | 122   swap | diff -4  MB
hm001:   df 0       smaps 101   SwapCache 25    | 121   swap | diff -5  MB
bm003:   df 0       smaps 98    SwapCache 15    | 107   swap | diff -6  MB
bm005:   df 0       smaps 70    SwapCache 17    | 85    swap | diff -2  MB
sg004:   df 0       smaps 72    SwapCache 14    | 83    swap | diff -3  MB
sg001:   df 0       smaps 41    SwapCache 33    | 78    swap | diff 4   MB
sg005:   df 0       smaps 59    SwapCache 20    | 75    swap | diff -4  MB
sg003:   df 0       smaps 58    SwapCache 18    | 72    swap | diff -4  MB
sg006:   df 0       smaps 56    SwapCache 13    | 65    swap | diff -4  MB
sg002:   df 0       smaps 54    SwapCache 12    | 64    swap | diff -2  MB
xa001:   df 0       smaps 56    SwapCache 5     | 55    swap | diff -6  MB

Et une petite expérience en bonus:

[root@hm012:~]# df -h|grep -e '^Filesystem' -e '^tmpfs'
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                  12G  271M   12G   3% /dev/shm
tmpfs                 8.0G   84K  8.0G   1% /tmp
[root@hm012:~]# ./get_swap.sh
 df 270     smaps 161   SwapCache 29    | 454   swap | diff -6  MB
[root@hm012:~]# rm -rf /dev/shm/*
[root@hm012:~]# df -h|grep -e '^Filesystem' -e '^tmpfs'
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                  12G     0   12G   0% /dev/shm
tmpfs                 8.0G   84K  8.0G   1% /tmp
[root@hm012:~]# ./get_swap.sh
 df 0       smaps 161   SwapCache 29    | 185   swap | diff -5  MB

PS en dehors de l'approximation mentionnée ci-dessus - il existe d'autres sources d'erreur, comme l'arrondi de Ko en Mo, la possibilité théorique d'un décalage entre les tailles de bloc de RAM et de swap, etc. Je ne suis pas sûr que cela couvre tout, mais j'espère que cela aide dans une certaine mesure :)

Vlad
la source