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.
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.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 lesSwap
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 quecat
ci - dessous n'est pas inutile et nécessite en fait une2>/dev/null
)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 nonroot
, mais elles se déséchangent également) quelques pages pendant la traversée). La manière la plus simple est d'utiliser du bon vieuxdf
.something_else - voir le "
diff 385 MB
" ci-dessous, a besoin d'une plongée dans les sources du noyau. Voir mon script:et la sortie de différentes cases:
Et une petite expérience en bonus:
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 :)
la source