2014-12-02 66 views
17

看起來(從Linux內核source看)/proc/pid/smaps中的Swap:度量標準是指定pid可訪問的總交換量。Linux/proc/pid/smaps比例交換(像Pss,但交換)

在存在共享存儲器參與的情況下,這似乎是實際交換使用量的過近似。例如,當總結父pid與其分叉的子元素的交換使用情況並且它們在交換中具有共同的共享內存時,看起來這部分(交換的共享內存)被多次計數(每pid一次)。

我的問題是,是否有要弄清楚基於進程共享它的數量(類似Pss:)公平交換使用度量的方式。

+0

你認爲它可能是有用的你的目的來分析'top'或'htop'的輸出?他們似乎有很多關於'swap'和共享內存使用的選項...... – Hastur 2014-12-15 07:58:08

+0

我不認爲top或htop提供了我需要的具體信息(比例交換)。 – 2014-12-17 14:09:26

+0

嘗試在http://superuser.com/ – 2014-12-22 10:49:28

回答

1

你只需要除以正在共享此虛擬內存區域進程的數量Swap值。

其實,我沒有找到如何獲取進程共享VMA的數量。但是,有時可以通過RSSPSS來計算。當然,只有在PSS != 0的情況下才有效。

Finaly,您可以使用此Perl代碼(通過smap文件作爲參數):

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

您可以使用工具smem的輸出。它有多個輸出和過濾選項。

+0

處提問此問題,我認爲smem僅報告常駐(內存中)比例集大小,而不是按比例交換(在磁盤上),這正是我所要求的。 – 2014-12-17 14:11:20

1

您可以從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

也檢查這一個:http://stackoverflow.com/questions/479953/how-to-find-out-which-processes-are-swapping-in-linux – eddy85br 2015-02-02 21:01:24