linux procfs mmu

Intercambio proporcional de Linux/proc/pid/smaps(como Pss pero para swap)



procfs mmu (3)

Puede adaptar este script desde http://northernmost.org/blog/find-out-what-is-using-your-swap/ :

#!/bin/bash # Get current swap usage for all running processes # Erik Ljungstrom 27/05/2011 # ## I''ve made some modifications to match my purposes. ## PIDs that don''t use swap are printed to STDERR and not STDOUT... OVERALL=0 PROGLIST=$(ps axw -o pid,args --no-headers) while read PID ARGS; do SUM=0 if [ -f "/proc/$PID/smaps" ]; then for SWAP in $(fgrep ''Swap'' /proc/$PID/smaps 2>/dev/null | awk ''{ print $2 }'') ; do let SUM=$SUM+$SWAP done fi if [[ $SUM > 0 ]]; then printf "PID: %-6s | Swap used: %-6s KB => %s/n" $PID $SUM "$ARGS" else printf "Not using Swap, PID: %-6s => %s/n" $PID "$ARGS" 1>/dev/stderr fi let OVERALL=$OVERALL+$SUM done <<<"$PROGLIST" echo "Overall swap used: $OVERALL" exit 0;

Este enlace podría ser útil también.

Parece (de mirar la source kernel de Linux) que la métrica Swap: en /proc/pid/smaps es el intercambio total accesible por el pid dado.

En el caso de que haya memoria compartida involucrada, esto parece ser una sobre-aproximación del uso de intercambio real. Por ejemplo, al sumar el uso de swap de un pid padre con sus hijos bifurcados, y si tienen una memoria compartida común en el swap, parece que esta parte (memoria compartida intercambiada) se cuenta varias veces (una vez por pid).

Mi pregunta es si hay una manera de averiguar una métrica de uso de intercambio justa basada en la cantidad de procesos que la comparten (similar a Pss: .


Puede utilizar el resultado de la herramienta smem. Tiene múltiples opciones de salida y filtro.


Solo tiene que dividir el valor de Swap por el número de procesos que comparten este Área de memoria virtual.

En realidad, no encontré cómo obtener el número de procesos que comparten un VMA. Sin embargo, en algún momento es posible calcularlo dividiendo RSS con PSS . Claro, solo funciona si PSS != 0 .

Finalmente, puedes usar este código perl (pasar el archivo smap como argumento):

#!/usr/bin/perl -w my ($rss, $pss); my $total = 0; while(<>) { $rss = $1 if /Rss: *([0-9]*) kB/; $pss = $1 if /Pss: *([0-9]*) kB/; if (/Swap: *([0-9]*) kB/) { my $swap = $1; if ($swap != 0) { if ($pss == 0) { print "Cannot get number of process using this VMA/n"; } else { my $swap = $swap * $rss / $pss; print "P-swap: $swap/n"; } $total += $swap; } } } print "Total P-Swap: $total kB/n"