Linux/proc/pid/сокращает пропорциональный своп (например, Pss, но для обмена)
Похоже, (смотря на ядро Linux source), что метка Swap:
в /proc/pid/smaps
- это общий доступ к свопу по данному pid.
В случае, когда используется разделяемая память, это, по-видимому, является чрезмерной аппроксимацией фактического использования swap. Например, суммируя использование swap родительского pid с его разветвленными дочерними элементами, и если у них есть общая разделяемая память в свопе, то оказывается, что эта часть (обменная разделенная память) подсчитывается несколько раз (один раз за pid).
Мой вопрос заключается в том, есть ли способ определить показатель использования честного свопа, основанный на количестве процессов, которые он использует (аналогично Pss:
).
Ответы
Ответ 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"
Ответ 2
Вы можете адаптировать этот script от 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;
Эта ссылка также может быть полезна.
Ответ 3
вы можете использовать вывод утилиты smem. Он имеет несколько вариантов вывода и фильтрации.