Apenas comencé a buscarlo ayer para mis necesidades, a continuación es lo que he encontrado hasta ahora:
SWAP_USED = Used_by_Processes + SwapCached + Part_of_Tmpfs + something_else
Cuento:
Used_by_Processes : datos que se han intercambiado completamente de la memoria.
SwapCached : datos que se han intercambiado al disco, pero que aún permanecen en la memoria.
Part_of_Tmpfs : parte de los datos de tmpfs.
Larga historia:
Used_by_Processes : hay muchas instrucciones publicadas sobre cómo calcular erróneamente esta;) Por ejemplo, si resumimos todas las VmSwap
entradas /proc/*/status
o Swap
entradas de /proc/*/smaps
, obtendremos una sobreestimación (las páginas intercambiadas compartidas podrían contarse más de una vez). Si no lo ejecutamos desde el root
usuario o nuestro sistema operativo, la subestimación será devuelta en silencio. No tengo una forma adecuada de identificar páginas compartidas, pero salpicar los mismos 'mapas' ofrece una aproximación mucho mejor que otros enfoques: (tenga en cuenta que a cat
continuación no es inútil y realmente necesita 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 : este es sencillo y se puede extraer de forma limpia /proc/meminfo
. Algunas personas no esperarían que esto se cuente como intercambio "usado", ya que una copia duplicada (no sucia) de la misma página en RAM y Swap se puede liberar en cualquier lado de forma bastante instantánea (en caso de que la demanda llegue) una de las copias "liberadas".
Parte_de_Tmpfs : el lado positivo es que cuando todos sus datos tmpfs están intactos durante muchos días y swappiness
no son cero, es muy probable que se intercambien tmpfs completos (y viceversa para los datos utilizados recientemente). La desventaja es que no encontré ninguna API para calcular de manera confiable el umbral o el porcentaje de la cantidad que se intercambia, aunque si hay suficiente RAM, podemos copiar datos tmpfs completos /dev/null
y así obtener alguna pista de cuánto se intercambió.
Los errores comunes cometidos durante el cálculo del tamaño de tmpfs son: suponiendo que /dev/shm
es el único tmpfs configurado o tratando de hacerlo mediante el escaneo recursivo por archivo (no solo las implementaciones tienden a omitir archivos ocultos o no root
, sino que también intercambian algunas páginas durante el recorrido). Una forma mucho más fácil es usar buenos viejos df
.
something_else - vea el " diff 385 MB
" a continuación, necesita una inmersión en las fuentes del kernel. Ver mi guión:
#!/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"
y la salida de diferentes cajas:
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
Y un pequeño experimento como bonificación:
[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
PD, aparte de la aproximación mencionada anteriormente: hay otras fuentes de error, como el redondeo de KB en MB, la posibilidad teórica de una falta de coincidencia entre los tamaños de bloque de RAM y Swap, etc. No estoy seguro de que cubra todo, pero espero que esto ayuda en cierta medida :)
VmSwap
línea/proc/PID/status
? La pregunta no es pedir una pantalla más bonita, sino qué podría haber en el intercambio además de los datos del proceso.