come verificare cosa c'è in scambio?


15

Sul mio sistema ho usato una certa quantità di swap:

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

Come verificare cosa c'è in scambio?

Provo a controllarlo tramite i processi, ma per ogni pid sul sistema VmSwap è 0:

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

Cos'altro può essere scambiato? Ho pensato a tmpfs - ma rileggo tutti i file su tmpfs-es - e non scarica la dimensione dello swap.


Risposte:


9

smemè lo strumento standard per questo. È pulito e semplice.

Su un sistema basato su Debian, installalo tramite Gestione pacchetti:

 sudo apt-get install smem

Un esempio di output (troncato) dal mio sistema:

$ 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 

6
Ma restituisce qualcosa di diverso dal valore mostrato nella VmSwapriga in /proc/PID/status? La domanda non è chiedere una visualizzazione più carina, è chiedere cosa potrebbe esserci uno scambio diverso dai dati di processo.
Gilles 'SO- smetti di essere malvagio'

1
smem non mi dà niente di più utile di greping proc: undefine @ uml: ~ $ sudo smem -c swap | uniq -c 1 Swap 227 0
undefine

2

Ho iniziato a esaminarlo solo ieri per le mie esigenze, di seguito è quello che ho trovato finora:

SWAP_USED = Used_by_Processes + SwapCached + Part_of_Tmpfs + something_else

Storia breve:

Used_by_Processes : dati che sono stati completamente sostituiti dalla memoria.

SwapCached : dati che sono stati scambiati su disco, ma rimangono ancora in memoria.

Part_of_Tmpfs : parte dei dati tmpfs.

Lunga storia:

Used_by_Processes - ci sono molte istruzioni pubblicate su come calcolare erroneamente questo;) Ad esempio se sommiamo tutte le VmSwapvoci da /proc/*/statuso Swapvoci da /proc/*/smaps- otterremo una sopravvalutazione (le pagine scambiate condivise potrebbero essere conteggiate più di una volta). Se non lo eseguiamo rootdall'utente o dal nostro sistema operativo, la sottovalutazione verrà restituita silenziosamente. Non ho un modo corretto di identificare le pagine condivise, ma gli schizzi delle stesse "mappe" offrono un'approssimazione molto migliore rispetto ad altri approcci: (nota che di catseguito non è inutile e in realtà ha bisogno di un 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 : questo è semplice e può essere estratto in modo chiaro /proc/meminfo. Alcune persone non si aspetterebbero che questo venga conteggiato come scambio "usato", dal momento che una copia duplicata (non sporca) della stessa pagina sia nella RAM che nello Swap può essere liberata su entrambi i lati abbastanza istantaneamente (nel caso in cui la domanda arriva) facendo così una delle copie "liberate".

Part_of_Tmpfs - il lato positivo è che quando tutti i tuoi dati tmpfs non vengono toccati per molti giorni e swappinesssono diversi da zero - è molto probabile che interi tmpfs vengano scambiati (e viceversa per i dati utilizzati di recente). Il rovescio della medaglia è che non ho trovato API per calcolare in modo affidabile la soglia o la percentuale di quanto viene scambiato, anche se se c'è abbastanza RAM - possiamo copiare interi dati tmpfs /dev/nulle quindi ottenere qualche indizio su quanto di esso sia stato scambiato.

Gli errori comuni commessi durante il calcolo della dimensione di tmpfs sono: supponendo che /dev/shmsia l'unico tmpfs configurato o che provi a farlo tramite la scansione ricorsiva per file (non solo le implementazioni tendono a omettere i file nascosti o a farlo da non- root, ma anche a non scambiare alcune pagine durante l'attraversamento). Un modo molto più semplice è usare il buon vecchio df.

something_else - vedi il " diff 385 MB" sotto, ha bisogno di un tuffo nei sorgenti del kernel. Vedi la mia sceneggiatura:

#!/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"

e l'output da diverse caselle:

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

E un piccolo esperimento come 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 a parte l'approssimazione sopra menzionata - ci sono altre fonti di errore, come l'arrotondamento di KB in MB, la possibilità teorica di una discrepanza tra dimensioni dei blocchi di RAM e Swap, ecc. Non sono sicuro che copra tutto, ma spero che questo aiuta in una certa misura :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.