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.
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.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
oSwap
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 elroot
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 acat
continuación no es inútil y realmente necesita un2>/dev/null
)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 noroot
, sino que también intercambian algunas páginas durante el recorrido). Una forma mucho más fácil es usar buenos viejosdf
.something_else - vea el "
diff 385 MB
" a continuación, necesita una inmersión en las fuentes del kernel. Ver mi guión:y la salida de diferentes cajas:
Y un pequeño experimento como bonificación:
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 :)
fuente