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 VmSwap
entrées de /proc/*/status
ou les Swap
entré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' root
utilisateur 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 cat
ci - 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 swappiness
non 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/null
et 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/shm
soit 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 :)
VmSwap
ligne/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.