2014-12-02 9 views
17

Wygląda na to (patrząc na jądro Linuksa source), że metryka Swap: w /proc/pid/smaps jest całkowitą wymianą dostępną dla danego pidu.Linux/proc/pid/smaps proporcjonalna zamiana (jak Pss ale dla zamiany)

W przypadku, gdy w grę wchodzi pamięć współdzielona, ​​wydaje się to zbyt dużą aproksymacją rzeczywistego użycia zamiany. Na przykład przy podsumowywaniu użycia swapu rodzicielskiego pid z jego rozwidlonymi dziećmi i jeśli mają wspólną pamięć współdzieloną w swapzie, okazuje się, że ta część (zamieniona pamięć współdzielona) jest liczona wiele razy (raz na pid).

Moje pytanie dotyczy tego, czy istnieje sposób obliczenia wartości użytkowej sprawiedliwego wymiany w oparciu o liczbę procesów, które go dzielą (podobnie jak w przypadku Pss:).

+0

Myślałeś może to być przydatne dla twój cel do analizowania wyjście 'top' lub' htop'? Wydają się mieć dużą liczbę opcji dotyczących używania 'swap' i pamięci współdzielonej ... – Hastur

+0

Nie uważam, że top lub htop dostarczają konkretnych informacji, których potrzebuję (proporcjonalna wymiana). –

+0

Postaraj się zadać to pytanie na stronie http://superuser.com/ –

Odpowiedz

1

Po prostu trzeba podzielić Swap wartość przez liczbę procesów, które dzielą ten obszar pamięci wirtualnej.

Właściwie to nie znalazłem sposobu, aby uzyskać liczbę udostępniania procesu VMA. Jednak możliwe jest obliczenie go poprzez podzielenie RSS z PSS. Oczywiście, działa to tylko jeśli PSS != 0.

Finaly, można użyć tego kodu Perla (przesuń smap plik jako argument):

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

możesz użyć wyjścia narzędzia smem. Ma wiele opcji wyjściowych i filtrów.

+0

Spojrzałem i myślę, że smem zgłasza tylko rezydentny (w pamięci) proporcjonalny rozmiar zestawu, a nie proporcjonalną zamianę (na dysku), o co prosiłem. –

1

można przystosować ten skrypt od 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

Sprawdź również: http://stackoverflow.com/questions/479953/how-to-find-out-which-processes-are-swapping-in-linux – eddy85br