'ps -ef'를 수행하면 각 프로세스의 메모리 사용량을 어떻게 표시 할 수 있습니까?


24

리눅스에서 어떻게하면 각 프로세스의 메모리 사용량을 표시 할 수 ps -ef있습니까? 각 진행 상황의 '가상 메모리', 'res memory', 'shared memory'를보고 싶습니다. 통해 얻을 수 top있지만 프로세스 이름으로 ps -ef출력을 파이프 할 수 있도록 동일한 정보를 원합니다 grep.

답변:


8

ps를 통해 메모리 사용을 얻는 것은 신뢰할 수 없습니다. 최신 커널을 사용하는 경우 각 프로세스 메모리 사용량에 대한 자세한 정보를 제공하는 / proc / pid # / smaps를 지원해야합니다. 아래는 열려있는 각 프로세스를 반복하고 크기, Rss, Pss 및 Shared Clean / Dirty 사용법을 파악하는 매우 더럽고 빠른 스크립트입니다. 바라건대 어떤 방식으로 유용 할 수 있기를 바랍니다.

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
            echo "* Mem usage for PID $pid"
            echo "-- Size:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
            echo "-- Rss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
            echo "-- Pss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
            echo "Shared Clean"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
            echo "Shared Dirty"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
    fi
done

1
크기 열을 합산해야합니다. 아래의 ezsmith의 답변을 참조하십시오.
바질 A

11

ps ef -o command,vsize,rss,%mem,size

공유 메모리에 대한 옵션을 찾을 수 없지만 총 실제 메모리의 % 및 프로세스를 스왑 아웃하는 데 필요한 스왑 공간의 크기에 대한 옵션을 찾았습니다. 이것에 대한 더 많은 정보는 ps man 페이지에 문서화되어 있습니다.


리눅스는 각 프로세스에 대해 메모리의 공유 메모리를 고려하므로, 하나의 거대한 공유 메모리 세그먼트에 많은 프로세스가 연결되어 있다면 허위로 이어질 수 있습니다. top, ps및 유사한 프로그램은 모두 동일한 방식으로 영향을받습니다.
Peter Eisentraut

공유 메모리의 작동 방식을 알고 있지만 ps가 해당 정보를 제공 할 수없는 것 같습니다 (또는 적어도 내 ps 문서에서 찾을 수 없었습니다). top 또는 htop은 실제로 프로세스별로 공유 메모리 사용량을 표시 할 수 있습니다.
Justin Smith

9

@ user26528의 대답은 메모리를 올바르게 계산하지 못합니다. 상단의 맵뿐만 아니라 스맵의 매핑 합계가 필요합니다. 이 스크립트는 다음을 수행해야합니다.

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
        echo "* Mem usage for PID $pid"     
        rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
        sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)            
        sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        echo "-- Rss: $rss kB" 
        echo "-- Pss: $pss kB"
        echo "Shared Clean $sc kB"
        echo "Shared Dirty $sd kB"
        echo "Private $(($pd + $pc)) kB"
    fi
done

출력 : 라인 16 : + : 구문 오류 : 피연산자가 예상됩니다 (오류 토큰은 "+"). .
향미료에

2
@evsmith 왜 Pss에 0.5를 추가합니까?
Pete

1
10,000 개의 작은 Awk 스크립트를 실행하는 것은 방대한 패턴입니다.이 모든 것을 단일 Awk 스크립트로 리팩터링하면됩니다.
Tripleee

그러나이 스크립트 자체는 너무 많은 메모리를 소비합니다
mehmet riza oz

8

메모리 사용량별로 프로세스 나열

ps -e -orss =, args = | 정렬 -b -k1,1n


ps -e -orss=,pid=,args= | sort -b -k1,1n프로세스 ID를 포함시키는 데 사용
Jacob

ps자체적으로 정렬 할 수 있습니다.ps -eo rss=,args= --sort +rss
phil294


3

mem 사용량별로 프로세스 나열

명령 : ps -e -orss =, args = | -b -k1,1n 정렬 | 홍보 -TW $ COLUMNS \


3

최신 정보:

다음 원 라이너는 현재 사용자의 총 메모리 소비에 대한 정보도 제공합니다.

echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"

방금 다음과 같이 MB 단위의 가장 높은 메모리 사용량으로 정렬 된 모든 사용자 프로세스를 나열했습니다.

ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done

전체 경로 프로세스를 표시하는 command=대신 사용할 수 있습니다 comm=.

=단지 열 제목을 제거합니다.


3

동일한 프로세스에 포크 하위 프로세스가 여러 번 있으며 프로세스에서 사용하는 총 메모리에 관심이 있다는 것을 알았습니다. 예를 들어 Google 크롬은 여러 프로세스를 시작하며 크롬이 차지한 총 메모리를 알고 싶습니다. 아래 한 줄 명령이 매우 유용하다는 것을 알았습니다.

echo "%CPU   %MEM    MEM     PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5

MB 단위의 메모리 표시, 메모리 정렬 및 주로 명령별로 그룹화와 같은 많은 작업을 처리합니다. 또한 % CPU 및 % memory를 그룹화합니다. 사용자 친화적 인 형식으로 데이터를 표시합니다.

이 명령은 답변 에서 영감을 얻어 어떤 프로세스가 내 리소스를 차지하는 지에 대한 아이디어를 얻는 데 많은 도움이되었습니다.

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