Linux에서 스왑 공간을 사용하는 프로세스를 찾는 방법은 무엇입니까?


240

Linux에서 스왑 공간을 더 많이 사용하는 프로세스를 어떻게 알 수 있습니까?


30
당신의 대답은 틀 렸습니다. lolotux의 답변으로 변경하는 것을 고려하십시오. 실제로 정확합니다.
jterrace

@jterrace가 정확합니다. 스왑 공간이 SWAP 열의 합계보다 많지 않습니다.
akostadinov

1
iotop 라이브 IO의 통계 및 프로세스 / 스레드 당 스왑 사용량을 보여줍니다 매우 유용한 명령입니다
선일

@jterrace, 진술 고려 누구의 더 - 일 허용 - 답변 - 중 - 잘못된 것입니다. 6 년 후, 우리 중 나머지는 David Holm의 답변 (현재 받아 들여진 답변) 또는 다른 답변을 언급하고 있는지 전혀 모릅니다. (글쎄, 당신은 그의 대답에 대한 의견으로 David Holm의 대답이 잘못되었다고 말한 것을 보았습니다 ... 그래서 아마 당신 은 그를 의미 했을 것입니다 .)
Don Hatch

답변:


106

top 을 실행 한 다음을 누릅니다 OpEnter. 이제 프로세스는 스왑 사용량별로 정렬되어야합니다.

주석에서 지적한대로 원래 답변이 문제에 대한 정확한 답변을 제공하지 않으므로 업데이트 내용입니다. 로부터 htop 자주 묻는 질문 :

프로세스에서 사용 된 스왑 공간의 정확한 크기를 얻을 수 없습니다. Top은 SWAP = VIRT-RES를 만들어서이 정보를 위조하지만, 비디오 메모리와 같은 다른 것들도 VIRT에 포함되기 때문에 좋은 척도는 아닙니다 (예 : top은 내 X 프로세스가 81M의 스왑을 사용하고 있지만 시스템 전체가 2M의 스왑 만 사용하고 있다고보고하므로이 정보를 얻는 신뢰할 수있는 방법을 모르기 때문에 비슷한 스왑 열을 htop에 추가하지 않습니다 (실제로는 얻을 수 없다고 생각합니다) 공유 페이지로 인해 정확한 숫자).


137
문서에서 맨 위의 SWAP 열은 현재 실제로 교환되는 프로세스의 양이 아니라 전체 프로세스가 스왑 된 경우 얼마나 많은 스왑이 필요한지 보여줍니다. 짧은 검색 후 알 수있는 것으로부터 현재 각 프로세스가 얼마나 많이 스왑되는지 확인할 수있는 방법이 없습니다. htop의 저자는 이것 때문에 이러한 열에 넣기를 거부합니다 (CNSWAP 및 NSWAP 열을 볼 수 있지만 내 컴퓨터에서는 아무것도하지 않는 것 같습니다) : htop.sourceforge.net/index.php?page=faq
yukondude 2009

6
@ yukondude가 맞습니다. 맨 위의 SWAP 열은 VIRT-RES 이며이 정보는이 맥락에서 쓸모가 없습니다. 매핑 된 비디오 RAM의 공유 메모리에 대한 보상은 없습니다. 또한 프로세스가 아직 모든 메모리를 참조하지 않았을 수도 있습니다. 이 경우 OS가 디스크에서 메모리로 전체 바이너리를 읽을 필요가 없으므로 RES 값에는이 메모리 부분이 포함되지 않습니다.
Bart

가능하다면 더 많이 투표 할 것입니다. 이것은 내 베이컨을 절약하고 있습니다!

고맙게도 그것은 @jterrace에 대한 의견입니다 :) (물론 당신은 그것들을 읽어야하지만 : S. atrain이 무엇을 말하는지 확신하지 못합니다, 유콘 친구가되기를 바랍니다)
AJP

11
주석이 더 이상 작동하지 않는 경우 : 최신 버전의 top은 더 이상 정렬 필드를 선택하기위한 키로 'O'가 설정되지 않은 것 같습니다. ?를 사용할 때? 키 실제 프로그램 이름과 버전을 볼 수 있습니다. procps-ng는 최신 버전입니다. 이것은 debian , Fedora 및 openSUSE의 포크입니다 : gitorious.org/procps . 여전히 SWAP 열에서 정렬을 수행하려면 'f'키를 사용하여 필드를보고 화살표 키를 사용하여 SWAP로 이동하고 's'를 사용하여 정렬을 설정 한 다음 'q'를 사용하십시오.
Pieter VN

294

내가 찾은 최고의 스크립트는이 페이지에 있습니다 : 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
# Modified by Mikko Rantalainen 2012-08-09
# Pipe the output to "sort -nk3" to get sorted output
# Modified by Marc Methot 2014-09-18
# removed the need for sudo

SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
do
    PID=`echo $DIR | cut -d / -f 3`
    PROGNAME=`ps -p $PID -o comm --no-headers`
    for SWAP in `grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'`
    do
        let SUM=$SUM+$SWAP
    done
    if (( $SUM > 0 )); then
        echo "PID=$PID swapped $SUM KB ($PROGNAME)"
    fi
    let OVERALL=$OVERALL+$SUM
    SUM=0
done
echo "Overall swap used: $OVERALL KB"

링크가 죽었을 경우의 사본은 다음과 같습니다. gitorious.org/dolanormisc/scripts/blobs/master/getswapused
TautrimasPajarskas

4
재미하지만, 내가 얻을 Overall swap used: 260672 KB무료 쇼 동안 738932사용 ...
Doncho Gunchev

23
동일한 출력이 10 배 더 빠릅니다 : for file in /proc/*/status ; do awk '/Tgid|VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | grep kB | sort -k 3 -nDebian / RH 6x +, Arch, Ubuntu (RH 5x has VmSize) ( source ). @dgunchev와 마찬가지로 전체 스왑보다 훨씬 적습니다 free. @ Tensibai는 아치에서 작동하지 않습니다. 당신의 awk는 무언가가 부족할 수 있습니다.
tuk0z

1
이 스크립트의 포크가 아닌 버전 을 살펴보십시오 !
F. Hauri

3
저자는 그것을 사용하는 방법에 대한 후속 포스트를 가지고 top: northernmost.org/blog/swap-usage-5-years-later
Jack Valmadre

53

다음은 스크립트의 다른 변형이지만 더 읽기 쉬운 출력을 제공하기 위해 정확한 결과를 얻으려면 루트로 실행해야합니다.

#!/bin/bash

    # find-out-what-is-using-your-swap.sh
    # -- Get current swap usage for all running processes
    # --
    # -- rev.0.3, 2012-09-03, Jan Smid          - alignment and intendation, sorting
    # -- rev.0.2, 2012-08-09, Mikko Rantalainen - pipe the output to "sort -nk3" to get sorted output
    # -- rev.0.1, 2011-05-27, Erik Ljungstrom   - initial version


SCRIPT_NAME=`basename $0`;
SORT="kb";                 # {pid|kB|name} as first parameter, [default: kb]
[ "$1" != "" ] && { SORT="$1"; }

[ ! -x `which mktemp` ] && { echo "ERROR: mktemp is not available!"; exit; }
MKTEMP=`which mktemp`;
TMP=`${MKTEMP} -d`;
[ ! -d "${TMP}" ] && { echo "ERROR: unable to create temp dir!"; exit; }

>${TMP}/${SCRIPT_NAME}.pid;
>${TMP}/${SCRIPT_NAME}.kb;
>${TMP}/${SCRIPT_NAME}.name;

SUM=0;
OVERALL=0;
    echo "${OVERALL}" > ${TMP}/${SCRIPT_NAME}.overal;

for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`;
do
    PID=`echo $DIR | cut -d / -f 3`
    PROGNAME=`ps -p $PID -o comm --no-headers`

    for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
    do
        let SUM=$SUM+$SWAP
    done

    if (( $SUM > 0 ));
    then
        echo -n ".";
        echo -e "${PID}\t${SUM}\t${PROGNAME}" >> ${TMP}/${SCRIPT_NAME}.pid;
        echo -e "${SUM}\t${PID}\t${PROGNAME}" >> ${TMP}/${SCRIPT_NAME}.kb;
        echo -e "${PROGNAME}\t${SUM}\t${PID}" >> ${TMP}/${SCRIPT_NAME}.name;
    fi
    let OVERALL=$OVERALL+$SUM
    SUM=0
done
echo "${OVERALL}" > ${TMP}/${SCRIPT_NAME}.overal;
echo;
echo "Overall swap used: ${OVERALL} kB";
echo "========================================";
case "${SORT}" in
    name )
        echo -e "name\tkB\tpid";
        echo "========================================";
        cat ${TMP}/${SCRIPT_NAME}.name|sort -r;
        ;;

    kb )
        echo -e "kB\tpid\tname";
        echo "========================================";
        cat ${TMP}/${SCRIPT_NAME}.kb|sort -rh;
        ;;

    pid | * )
        echo -e "pid\tkB\tname";
        echo "========================================";
        cat ${TMP}/${SCRIPT_NAME}.pid|sort -rh;
        ;;
esac
rm -fR "${TMP}/";

2
아주 좋은 스크립트. lolotux와 동일한 정보를 제공하지만 더 읽기 쉬운 방식으로 제공됩니다.
Philipp Wendler

뛰어난 출력. 감사.
Brian Cline

2
내가 변경 유일하게 사용 된 args대신 commps내가 이름은 같지만 서로 다른 인수 (파이썬 gunicorn 프로세스의 무리)와 프로세스를 많이 가지고 있기 때문에 명령. ps -p $PID -o args --no-headers
mgalgs

1
사이드 노트는 grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'간단하게 할 수awk ' /VmSwap/ { print $2 }'
Tensibai

12

나는이 스레드가 다소 오래되었다는 것을 알았지 만, 방금 그랬던 것처럼 당신이 그것을 우연히 발견하면 또 다른 대답은 smem을 사용하는 것입니다.

다음은 설치 방법과 사용 방법을 알려주는 링크입니다.

http://www.cyberciti.biz/faq/linux-which-process-is-using-swap/


이것은 좋은 것입니다. 다음은 PID가 추가 된 스왑 사용법으로 정렬 된 프로세스를 보여주기 위해 해당 기사의 수정 된 버전입니다. $ for / proc / * / status; awk '/ ^ Pid | VmSwap | 이름 / {printf $ 2 ""$ 3} END {print ""}'$ file; 완료 | 정렬 -k 3 -n -r | 적은
Stan Brajewski

당신은 특별한 / proc 디렉토리 항목의 몇 가지를 제외 / proc 디렉토리 / [1-9]는 * / 상태 glob에해야하고, 당신은 -rnk3으로 정렬 인수를 결합 할 수 있습니다
dland

10

대부분의 페이지가 스왑 아웃 된 프로세스 또는 대부분의 페이지가 스왑 아웃 된 프로세스를 찾으려고하는지 확실하지는 않습니다.

첫 번째 top로 스왑으로 실행 하고 주문할 수 있습니다 ( 'Op'를 누름). 후자를 vmstat위해 'so'에 대해 0이 아닌 항목을 찾을 수 있습니다 .


6

top 명령에는 프로세스의 페이지 결함 수를 표시하는 필드도 있습니다. 최대 페이지 결함이있는 프로세스가 가장 많이 교환되는 프로세스입니다. 장시간 실행되는 데몬의 경우 처음에 많은 수의 페이지 오류가 발생하고 나중에 그 수가 증가하지 않을 수 있습니다. 따라서 페이지 폴트가 증가하고 있는지 관찰해야합니다.


6

쉘에서 루프를 피하는 또 다른 스크립트 변형 :

#!/bin/bash
grep VmSwap /proc/[0-9]*/status | awk -F':' -v sort="$1" '
  {
    split($1,pid,"/") # Split first field on /
    split($3,swp," ") # Split third field on space
    cmdlinefile = "/proc/"pid[3]"/cmdline" # Build the cmdline filepath
    getline pname[pid[3]] < cmdlinefile # Get the command line from pid
    swap[pid[3]] = sprintf("%6i %s",swp[1],swp[2]) # Store the swap used (with unit to avoid rebuilding at print)
    sum+=swp[1] # Sum the swap
  }
  END {
    OFS="\t" # Change the output separator to tabulation
    print "Pid","Swap used","Command line" # Print header
    if(sort) {
      getline max_pid < "/proc/sys/kernel/pid_max"
      for(p=1;p<=max_pid;p++) {
        if(p in pname) print p,swap[p],pname[p] # print the values
      }
    } else {
      for(p in pname) { # Loop over all pids found
        print p,swap[p],pname[p] # print the values
      }
    }
    print "Total swap used:",sum # print the sum
  }'

표준 사용법은 script.sh임의의 순서로 ( awk해시를 저장 하는 방법에 따라) 프로그램 당 사용량을 얻 거나 script.sh 1pid로 출력을 정렬하는 것입니다.

내가하는 일을 알 수있을만큼 코드에 주석을 달았기를 바랍니다.


1
참고 bash정렬 방법 (어휘, 숫자되지 않음)에 디렉토리를 확장합니다. 무작위 순서는 awk배열을 저장 하는 방법 (해시 테이블)과 for p in pname검색 방법에 달려 있습니다.
Stephane Chazelas

@StephaneChazelas 글쎄, 그것은 어휘도 아니고, 그것은 아스키 코드 종류입니다 ( /proc/1/status후에 /proc/1992/status그리고 /아스키 코드 위에 아스키 코드가 있습니다. 이것은 "랜덤 순서"모양과 느낌을줍니다. 나는 awk 해시 테이블에 동의합니다 , 나는 여기에 지름길을
썼다

1
/proc/1/status/proc/1992/status순서가 바이트 값을 기반으로하는 C 로케일에서 나오지 않습니다 . 데이터 정렬 알고리즘의 첫 번째 인스턴스에서 무시되고 이후 정렬 en_GB.UTF-8되기 때문에 로케일 (또는 GNU 시스템의 경우)에서 수행 됩니다. 와 비교하십시오 . 이외의 로케일 에서 정렬 순서는 일반적으로 바이트 값을 기반 으로 하지 않습니다 . /s9printf '/proc/%s/status\n' 1 1992 | LC_ALL=en_GB.UTF-8 sortprintf '/proc/%s/status\n' 1 1992 | LC_ALL=C sortC
Stephane Chazelas

@StephaneChazelas 좋은 점은 로케일에 관한 것이 아닙니다. 다시 한 번 더 편집하여 정밀도를 추가하여 크레딧이 귀하의 것이 될 것입니다 (적어도 역사 편집에서).
Tensibai

2
끝난. 이 답변은 가장 많이 투표 된 것보다 훨씬 낫습니다. 더 많은 투표를받을 가치가 있습니다. 그건 여기에서 논의 된 다른 답변 왜 나쁜 사례로 간주 처리 텍스트 쉘 루프를 사용? 그것이 나를 여기로 데려온 것입니다.
Stephane Chazelas

6

그러나 두 가지 변형이 더 있습니다.

소규모 시스템에는 설치 top하거나 htop설치할 수 없기 때문에 탐색 /proc은 항상 가능합니다.

작은 시스템에서도 당신은 shell...

다른! (bash 만 아님)

이것은 lolotux 스크립트 와 정확히 동일 하지만 grep, awk또는에 대한 포크가 없습니다 ps. 이것은 훨씬 빠릅니다!

그리고 가장 가난한 사람 중 하나입니다 성능과 관련하여이 스크립트가 제대로 실행되도록하기 위해 약간의 작업이 수행되었습니다. , 그리고 다른 것. 그런 다음 ( Stéphane Chazelas 덕분에 ) 다시 훨씬 더 빨리됩니다!

#!/bin/sh 
# Get current swap usage for all running processes
# Felix Hauri 2016-08-05
# Rewritted without fork. Inspired by first stuff from
# Erik Ljungstrom 27/05/2011
# Modified by Mikko Rantalainen 2012-08-09
# Pipe the output to "sort -nk3" to get sorted output
# Modified by Marc Methot 2014-09-18
# removed the need for sudo

OVERALL=0
rifs=`printf ': \t'`
for FILE in /proc/[0-9]*/status ;do
    SUM=0
    while IFS="$rifs" read FIELD VALUE ;do
        case $FIELD in
            Pid )    PID=$VALUE      ;;
            Name )   PROGNAME="$VALUE" ;;
            VmSwap ) SUM=$((SUM=${VALUE% *}))  ;;
        esac
    done <$FILE
    [ $SUM -gt 0 ] &&
        printf "PID: %9d  swapped: %11d KB (%s)\n" $PID $SUM "$PROGNAME"
    OVERALL=$((OVERALL+SUM))
done
printf "Total swapped memory: %14u KB\n" $OVERALL

큰 따옴표를 잊어 버리지 마십시오 "$PROGNAME"! Stéphane Chazelas의 의견 참조 :

read FIELD PROGNAME < <(
    perl -ne 'BEGIN{$0="/*/*/../../*/*"} print if /^Name/' /proc/self/status
)
echo $FIELD "$PROGNAME"

echo $PROGNAME현명한 시스템에서 큰 따옴표없이 시도 하지 말고 현재 쉘을 죽일 준비를하십시오!

그리고 버전

이것이 간단한 스크립트 가 아니기 때문에 보다 효율적인 언어를 사용하여 전용 도구를 작성해야합니다.

#!/usr/bin/perl -w

use strict;
use Getopt::Std;
my ($tot,$mtot)=(0,0);
my %procs;

my %opts;
getopt('', \%opts);

sub sortres {
    return $a <=> $b                                          if $opts{'p'};
    return $procs{$a}->{'cmd'} cmp $procs{$b}->{'cmd'}        if $opts{'c'};
    return $procs{$a}->{'mswap'} <=> $procs{$b}->{'mswap'}    if $opts{'m'};
    return $procs{$a}->{'swap'} <=> $procs{$b}->{'swap'};
};

opendir my $dh,"/proc";

for my $pid (grep {/^\d+$/} readdir $dh) {
    if (open my $fh,"</proc/$pid/status") {
        my ($sum,$nam)=(0,"");
        while (<$fh>) {
            $sum+=$1 if /^VmSwap:\s+(\d+)\s/;
            $nam=$1 if /^Name:\s+(\S+)/;
        }
        if ($sum) {
            $tot+=$sum;
            $procs{$pid}->{'swap'}=$sum;
            $procs{$pid}->{'cmd'}=$nam;
            close $fh;
            if (open my $fh,"</proc/$pid/smaps") {
                $sum=0;
                while (<$fh>) {
                    $sum+=$1 if /^Swap:\s+(\d+)\s/;
                };
            };
            $mtot+=$sum;
            $procs{$pid}->{'mswap'}=$sum;
        } else { close $fh; };
    };
};
map {
    printf "PID: %9d  swapped: %11d (%11d) KB (%s)\n",
        $_, $procs{$_}->{'swap'}, $procs{$_}->{'mswap'}, $procs{$_}->{'cmd'};
} sort sortres keys %procs;
printf "Total swapped memory: %14u (%11u) KB\n", $tot,$mtot;

중 하나와 함께 실행할 수

-c  sort by command name
-p  sort by pid
-m  sort by swap values
by default, output is sorted by status's vmsize

프로세스 이름에 공백, 탭 :,, 백 슬래시, 와일드 카드 또는 제어 문자가 포함되지 않은 것으로 가정합니다 .
Stephane Chazelas

트윗 담아 가기 나는 번호가 매겨진 길만 세지 않기 위해 [1-9]이전 *에 추가했습니다 (아니 self, 아니 thread-self)
F. Hauri

1
구문은 알려져 있지만 프로세스 이름은 알 수 없습니다. 적어도 변수를 인용하십시오 . (어쨌든, 당신의 스크립트는 loloxux '보다 훨씬 나쁩니다.)
Stephane Chazelas

1
Linux의 프로세스 이름은 0을 제외한 모든 바이트 값을 포함 할 수 있지만 길이는 15 바이트로 제한됩니다. 의 Name항목 /proc/*/status은 해당 바이트 값 중 일부를 인코딩합니다. 예를 들어보십시오 perl -ne 'BEGIN{$0="\n\t\\"} print if /^Name/' /proc/self/status. 너무 짧기 때문에 perl -ne 'BEGIN{$0="/*/*/../../*/*"} print if /^Name/' /proc/self/status변수를 인용하는 것을 잊었을 때 와 같은 것들로 수행 할 수있는 피해 는 제한적입니다.
Stephane Chazelas

1
이 (난 그냥 시도 적어도 펄 버전)입니다 상당히 빨리 다른 답변보다.
David Gardner

5

웹의 다른 스크립트를이 긴 한 줄짜리에 적용했습니다.

 { date;for f in /proc/[0-9]*/status; do 
   awk '{k[$1]=$2} END { if (k["VmSwap:"]) print k["Pid:"],k["Name:"],k["VmSwap:"];}' $f 2>/dev/null; 
   done | sort -n ; }

그런 다음 cronjob에 던져서 출력을 로그 파일로 리디렉션합니다. 여기에있는 정보 Swap:는 smaps 파일 의 항목 을 누적하는 것과 동일 하지만 확실하게하려면 다음을 사용할 수 있습니다.

{ date;for m in /proc/*/smaps;do 
  awk '/^Swap/ {s+=$2} END { if (s) print FILENAME,s }' $m 2>/dev/null;
  done | tr -dc ' [0-9]\n' |sort -k 1n; }

이 버전의 출력은 pid, swap amount의 두 열에 있습니다. 위 버전에서 tr숫자가 아닌 구성 요소를 제거합니다. 두 경우 모두 출력은 pid로 숫자로 정렬됩니다.


2
이것은 좋지만 첫 번째는 pid 오름차순으로 정렬합니다 (sort -n). 더 나은 사용법은 스왑 사용법을 내림차순으로 정렬하는 것입니다 (목록에서 가장 많이 사용됨). "sort -n"을 "sort -n -k 3 -r"로 변경하려면
Stan Brajewski

3

MacOSX에서는 top 명령도 실행하지만 "o"를 입력 한 다음 "vsize"를 입력하고 ENTER를 입력해야합니다.


2

top많은 메모리를 사용하여 활성 프로세스를 실행 하고 찾아서 추측 할 수 있다고 생각합니다 . 프로그래밍 방식으로이 작업을 수행하는 것이 더 어렵습니다. Linux OOM 킬러 휴리스틱에 대한 끝없는 토론을 살펴보십시오.

스와핑 더 갖는 메모리의 함수 인 활성 은 단일 프로세스에 비난 일반적 어렵도록 설치된다보다 사용. 지속적인 문제인 경우 가장 좋은 해결책은 더 많은 메모리를 설치하거나 다른 시스템 변경을 수행하는 것입니다.



1

스왑 공간을 사용하는 프로세스를 정확히 찾는 방법에 대한 직접적인 대답은 모르겠지만이 링크가 도움 이 될 수 있습니다 . 또 다른 좋은 사람이 여기 있습니다

또한 htop과 같은 좋은 도구를 사용하여 많은 프로세스가 많은 메모리를 사용하고 있으며 전체 스왑 크기를 확인하십시오.


1

iotop매우 유용한 도구입니다. 프로세스 / 스레드 당 I / O 및 스왑 사용량에 대한 실시간 통계를 제공합니다. 기본적으로 스레드 당 표시되지만 iotop -P프로세스 정보를 가져 오려면 수행 할 수 있습니다 . 기본적으로 사용할 수 없습니다. rpm / apt를 통해 설치해야 할 수도 있습니다.


1

다음은 @loolotux의 스크립트와 동일하지만 출력 속도가 훨씬 빠르지 만 읽을 수있는 버전입니다. 그 루프는 내 컴퓨터에서 약 10 초가 걸리고 내 버전은 0.019 초가 걸리며 cgi 페이지로 만들고 싶었 기 때문에 나에게 중요합니다.

    join -t / -1 3 -2 3 \
    <(grep VmSwap /proc/*/status  |egrep -v '/proc/self|thread-self' | sort -k3,3 --field-separator=/ ) \
    <(grep -H  '' --binary-files=text /proc/*/cmdline |tr '\0' ' '|cut -c 1-200|egrep -v '/proc/self|/thread-self'|sort -k3,3 --field-separator=/ ) \
    | cut -d/ -f1,4,7- \
    | sed 's/status//; s/cmdline//' \
    | sort -h -k3,3 --field-separator=:\
    | tee >(awk -F: '{s+=$3} END {printf "\nTotal Swap Usage = %.0f kB\n",s}') /dev/null

1

SwapPss( https://lore.kernel.org/patchwork/patch/570506/ ) 을 추가하는 2015 년 커널 패치 이후로 비례 스왑 수를 얻을 수 있습니다. 즉, 프로세스가 많이 스왑 된 후 포크 된 프로세스를 의미합니다. 각각 50 %를 교환 한 것으로보고됩니다. 그리고 포크 중 하나 인 경우, 각 프로세스는 스왑 된 페이지의 33 %로 계산되므로 모든 스왑 사용량을 함께 계산하면 값에 프로세스 수를 곱한 값 대신 실제 스왑 사용량이 발생합니다.

한마디로 :

(cd /proc; for pid in [0-9]*; do printf "%5s %6s %s\n" "$pid" "$(awk 'BEGIN{sum=0} /SwapPss:/{sum+=$2} END{print sum}' $pid/smaps)" "$(cat $pid/comm)"; done | sort -k2n,2 -k1n,1)

첫 번째 열은 pid이고 두 번째 열은 KiB에서 스왑 사용량이며 나머지 행은 명령이 실행되고 있습니다. 동일한 스왑 수는 pid로 정렬됩니다.

위와 같은 라인을 방출 할 수 있습니다

awk: cmd. line:1: fatal: cannot open file `15407/smaps' for reading (No such file or directory)

이는 단순히 pid 15407을 가진 프로세스가 /proc/프로세스 smaps파일 목록을 보고 읽는 사이에 끝났음을 의미 합니다. 그것이 당신에게 중요하다면, 단순히 2>/dev/null끝에 추가 하십시오. 다른 가능한 진단 기능도 손실 될 수 있습니다.

실제 예제의 경우, 이는 하나의 서버에서 실행되는 각 아파치 하위에 대해 ~ 40MB 스왑 사용량을보고하는 다른 도구를 하위 당 실제로 사용 된 7-3630KB 사이의 실제 사용량으로 변경합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.