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;
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"