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

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



답변

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

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

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


답변

내가 찾은 최고의 스크립트는이 페이지에 있습니다 : 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"


답변

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

#!/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}/";


답변

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

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

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


답변

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

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


답변

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


답변

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

#!/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로 출력을 정렬하는 것입니다.

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