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 VmSwap
voci da /proc/*/status
o Swap
voci da /proc/*/smaps
- otterremo una sopravvalutazione (le pagine scambiate condivise potrebbero essere conteggiate più di una volta). Se non lo eseguiamo root
dall'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 cat
seguito 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 swappiness
sono 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/null
e 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/shm
sia 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 :)
VmSwap
riga in/proc/PID/status
? La domanda non è chiedere una visualizzazione più carina, è chiedere cosa potrebbe esserci uno scambio diverso dai dati di processo.