2014-12-02 14 views
17

Sembra (dal punto di vista del kernel Linux source) che la metrica in /proc/pid/smaps sia lo swap totale accessibile dal pid dato.Linux/proc/pid/smaps swap proporzionale (come Pss ma per lo scambio)

Nel caso in cui sia coinvolta memoria condivisa, questa sembra essere un'approssimazione del reale utilizzo dello swap. Ad esempio, quando si somma l'utilizzo dello swap di un pid genitore con i suoi figli biforcuti e se hanno una memoria condivisa comune nello swap, allora questa porzione (memoria condivisa scambiata) viene conteggiata più volte (una volta per pid).

La mia domanda è se esiste un modo per calcolare una metrica di utilizzo equo dello swap in base al numero di processi che lo condividono (simile a Pss:).

+0

Pensavi che potrebbe essere utile per il vostro scopo di analizzare l'output di 'top' o' htop'? Sembra che abbiano un buon numero di opzioni su "scambio" e utilizzo della memoria condivisa ... – Hastur

+0

Non penso che top o htop forniscano le informazioni specifiche di cui ho bisogno (scambio proporzionale). –

+0

Prova a fare questa domanda su http://superuser.com/ –

risposta

1

Non vi resta che dividere Swap il valore per il numero di processi che condividono questa area di memoria virtuale.

In realtà, non ho trovato come ottenere il numero di processi che condividono un VMA. Tuttavia, è talvolta possibile calcolarlo dividendo RSS con PSS. Certo, funziona solo se PSS != 0.

Finaly, è possibile utilizzare questo codice Perl (passare smap file come argomento):

#!/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" 
0

è possibile utilizzare l'output dello strumento smem. Ha più opzioni di output e filtro.

+0

Ho dato un'occhiata e penso che smem riferisca solo residente (in memoria) proporzionale, non proporzionale di swap (su disco) che è quello che stavo chiedendo. –

1

È possibile adattare questo script da 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; 

This link could be helpful too.

+0

Controlla anche questo: http://stackoverflow.com/questions/479953/how-to-find-out-which-processes-are-swapping-in-linux – eddy85br