특정 프로세스의 전체 메모리 사용량을 얻고 싶습니다. 예를 들어, 총 메모리 양을 얻고 싶다고 가정해 보겠습니다.httpd. 따라서 tail 명령을 실행하면 다음과 같은 결과 tail -M
가 나타납니다.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10036 mysql 20 0 417m 76m 3820 S 0.3 15.5 0:13.55 mysqld
10453 apache 20 0 229m 67m 42m S 0.0 13.7 0:10.81 httpd
10447 apache 20 0 230m 64m 38m S 0.0 13.0 0:11.54 httpd
10479 apache 20 0 226m 64m 42m S 0.0 13.0 0:09.75 httpd
10478 apache 20 0 230m 63m 38m S 0.0 12.9 0:11.02 httpd
10451 apache 20 0 230m 63m 37m S 0.0 12.8 0:10.37 httpd
9599 apache 20 0 227m 61m 38m S 0.0 12.4 0:10.80 httpd
10454 apache 20 0 226m 60m 38m S 0.0 12.2 0:09.56 httpd
10476 apache 20 0 225m 58m 38m S 0.0 11.9 0:09.87 httpd
10332 apache 20 0 228m 50m 24m S 0.0 10.2 0:13.73 httpd
10445 apache 20 0 220m 42m 24m S 0.0 8.5 0:10.17 httpd
637 root 10 -10 32816 25m 1712 S 0.0 5.2 0:00.01 iscsiuio
652 root 10 -10 5128 2972 1876 S 0.0 0.6 0:05.86 iscsid
9592 root 20 0 207m 2872 900 S 0.0 0.6 0:00.39 httpd
10196 nobody 20 0 136m 2408 500 S 0.0 0.5 0:00.79 memcached
이 경우 출력의 각 줄에 "VIRT", "RES", "SHR", "%CUP" 및 "%MEM"을 추가하고 싶습니다.
내가 할 수 있을까?
답변1
다음을 사용하여 이 작업을 수행해 보세요.앗:
top -b -n1 -c |
awk -vOFS=$'\t' '
$2 == "apache"{
virt+=$5; res+=$6; shr+=$7; cpu+=$9; mem+=$10; count++
}
END{
print "virt", "res", "shr", "cpu", "mem"
print virt, res, shr, cpu/count, mem/count
}
'
답변2
프로세스의 메모리 사용량은 잘 정의된 개념이 아닙니다. 공유 메모리 영역(공유 라이브러리, 실행 파일을 공유하는 여러 프로세스, 수정되지 않은 데이터를 공유하는 상위/하위 프로세스)이 있습니다. 지금 스레드를 사용하는 경우 정의에 따라 모든 스레드는 포함 프로세스의 리소스를 공유합니다.
답변3
top
공유 메모리로 인해 메모리 값을 통계적으로 보고할 방법이 없습니다. 특히 동일한 프로세스의 여러 복사본이 있는 아파치와 같은 경우에는 더욱 그렇습니다. 라는 스크립트가 있습니다.ps_mem.py
커널 보고서 > 2.6.23이 있는 한 공유 메모리를 고려하므로 메모리를 사용하는 것이 무엇인지 더 잘 알 수 있습니다.비례 슈트 치수"또는 프로세스당 PSS.
PID당 메모리 사용량에 대해 더 자세히 알고 싶다면 Private_*
에서 값을 계산할 수도 있습니다 /proc/[0-9]*/smaps
. 여기서 전용 메모리는 유일하게 의미 있는 값입니다.