17

(Linux カーネルソースを見ると) のSwap:メトリック/proc/pid/smapsは、指定された pid によってアクセス可能な合計スワップであるようです。

共有メモリが関係している場合、これは実際のスワップ使用量を過大評価しているようです。たとえば、親 pid とそのフォークされた子のスワップ使用量を合計すると、それらがスワップ内に共通の共有メモリを持っている場合、この部分 (スワップされた共有メモリ) が複数回 (pid ごとに 1 回) カウントされるように見えます。

私の質問は、それを共有しているプロセスの数に基づいて公正なスワップ使用メトリックを把握する方法があるかどうかです (同様にPss:)。

4

3 に答える 3

1

Swapこの仮想メモリ領域を共有しているプロセスの数で値を割るだけです。

実際、VMA を共有しているプロセスの数を取得する方法が見つかりませんでした。ただし、 で割ることで計算できる場合もありRSSますPSS。確かに、それは次の場合にのみ機能しますPSS != 0

最後に、この 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"
于 2015-06-30T12:48:32.190 に答える
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;

このリンクも役立つ場合があります。

于 2015-02-02T20:56:11.007 に答える
0

ツール smem の出力を使用できます。複数の出力およびフィルター オプションがあります。

于 2014-12-17T07:42:03.390 に答える