Ich habe erst gestern angefangen, mich damit zu befassen, was ich bisher gefunden habe:
SWAP_USED = Used_by_Processes + SwapCached + Part_of_Tmpfs + something_else
Kurzgeschichte:
Used_by_Processes - Daten, die vollständig aus dem Speicher ausgelagert wurden .
SwapCached - Daten, die auf die Festplatte ausgelagert wurden , sich aber noch im Speicher befinden.
Part_of_Tmpfs - Ein Teil der tmpfs-Daten.
Lange Geschichte:
Used_by_Processes - es gibt viele Anleitungen, wie man diese falsch berechnet;) ZB wenn wir alle VmSwap
Einträge von /proc/*/status
oder Swap
Einträge von zusammenfassen, erhalten /proc/*/smaps
wir eine Überschätzung (geteilte getauschte Seiten können mehrmals gezählt werden). Wenn wir es nicht vom root
Benutzer oder von unserem Betriebssystem ausführen, wird die unterschätzte Anzahl stillschweigend zurückgegeben. Ich habe nicht eine richtige Art und Weise geteilt Seiten zu identifizieren, aber Verspritzen von gleichen ‚Karten‘ gibt viele bessere Annäherung als andere Ansätze: (beachten Sie, dass cat
unter nicht nutzlos ist und tatsächlich braucht ein 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 - dieses ist unkompliziert und kann sauber extrahiert werden /proc/meminfo
. Einige Leute würden nicht erwarten, dass dies als "verbrauchter" Tausch gewertet wird, da eine doppelte (nicht verschmutzte) Kopie derselben Seite sowohl im RAM als auch im Swap auf beiden Seiten ziemlich sofort freigegeben werden kann (falls Bedarf besteht) eine der Kopien "befreit".
Part_of_Tmpfs - die gute Seite ist, dass, wenn alle Ihre tmpfs-Daten viele Tage unberührt sind und swappiness
nicht Null sind, es sehr wahrscheinlich ist, dass ganze tmpfs ausgetauscht werden (und umgekehrt für kürzlich verwendete Daten). Der Nachteil ist, dass ich keine API gefunden habe, die den Schwellenwert oder den Prozentsatz der Auslagerungsmenge zuverlässig berechnet. Wenn jedoch genügend RAM vorhanden ist, können wir ganze tmpfs-Daten in diese kopieren /dev/null
und so einen Hinweis darauf erhalten, wie viel davon ausgelagert wurde.
Häufige Fehler bei der Berechnung der tmpfs-Größe sind - vorausgesetzt, dies /dev/shm
ist der einzige konfigurierte tmpfs oder der Versuch, dies durch rekursives Scannen pro Datei zu tun (bei Implementierungen werden nicht nur versteckte Dateien ausgelassen root
, sondern auch nicht ausgetauscht) einige Seiten beim Überqueren). Viel einfacher ist es, gute alte zu verwenden df
.
something_else - siehe " diff 385 MB
" unten, benötigt einen Einblick in die Kernelquellen. Siehe mein Skript:
#!/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"
und die Ausgabe von verschiedenen Boxen:
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
Und ein kleines Experiment als 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: Abgesehen von der oben erwähnten Annäherung gibt es andere Fehlerquellen, wie das Runden von KB in MB, die theoretische Möglichkeit einer Nichtübereinstimmung zwischen den Blockgrößen von RAM und Swap usw. Ich bin mir nicht sicher, ob dies alles abdeckt, hoffe es aber hilft in gewissem Maße :)
VmSwap
Zeile in angezeigten Wert zurück/proc/PID/status
? Bei der Frage geht es nicht um eine schönere Anzeige, sondern darum, was außer Prozessdaten im Swap enthalten sein könnte.