Wie kann ich überprüfen, was sich im Swap befindet?

15

Auf meinem System habe ich einige Swap verwendet:

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

Wie kann ich überprüfen, was sich im Swap befindet?

Ich versuche es über Prozesse zu überprüfen, aber für jede PID auf dem System ist VmSwap 0:

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

Was kann man sonst noch tauschen? Ich habe über tmpfs nachgedacht - aber ich habe alle Dateien auf tmpfs-es erneut gelesen - und die Swap-Größe wird nicht bereinigt.


undefinieren
quelle

Antworten:

9

smemist das Standardwerkzeug dafür. Es ist sauber und einfach.

Installieren Sie es auf einem Debian-basierten System über den Paket-Manager:

 sudo apt-get install smem

Eine (abgeschnittene) Beispielausgabe von meinem System:

$ 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
quelle
6
Gibt es aber etwas anderes als den in der VmSwapZeile 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.
Gilles 'SO- hör auf böse zu sein'
1
smem gibt mir nichts Nützlicheres als greping proc: undefine @ uml: ~ $ sudo smem -c swap | uniq -c 1 Swap 227 0
undefine
2

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 VmSwapEinträge von /proc/*/statusoder SwapEinträge von zusammenfassen, erhalten /proc/*/smapswir eine Überschätzung (geteilte getauschte Seiten können mehrmals gezählt werden). Wenn wir es nicht vom rootBenutzer 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 catunter 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 swappinessnicht 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/nullund so einen Hinweis darauf erhalten, wie viel davon ausgelagert wurde.

Häufige Fehler bei der Berechnung der tmpfs-Größe sind - vorausgesetzt, dies /dev/shmist 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 :)

Vlad
quelle