¿Cómo verificar qué hay en el intercambio?

15

En mi sistema tengo cierta cantidad de intercambio utilizado:

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

¿Cómo verificar qué hay en el intercambio?

Intento verificarlo a través de procesos, pero por cada pid en el sistema, VmSwap es 0:

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

¿Qué más puede haber en el intercambio? Pensé en tmpfs, pero volví a leer todos los archivos en tmpfs-es, y no elimina el tamaño de intercambio.


indefinido
fuente

Respuestas:

9

smemes la herramienta estándar para esto. Es limpio y simple.

En un sistema basado en Debian, instálelo a través del administrador de paquetes:

 sudo apt-get install smem

Una salida de muestra (recortada) de mi 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 
shivams
fuente
66
¿Pero devuelve algo más que el valor que se muestra en la VmSwaplí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.
Gilles 'SO- deja de ser malvado'
1
smem no me da nada más útil que el proceso greping: undefine @ uml: ~ $ sudo smem -c swap | uniq -c 1 Swap 227 0
undefine
2

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 VmSwapentradas /proc/*/statuso Swapentradas 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 rootusuario 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 catcontinuació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 swappinessno 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/nully 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/shmes 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 :)

Vlad
fuente