Linux에서 사용중인 메모리 프로세스의 양을 확인하는 방법은 무엇입니까?
LAMP 응용 프로그램에서 메모리 누수가있을 수 있습니다. (메모리가 다 스왑이 사용되는 등). 다양한 프로세스가 사용중인 메모리 양을 확인할 수있는 권한 문제 해결에 도움이 될 수 있습니다. * nix 에서이 정보를 볼 수있는 방법이 있습니까?
올바른 메모리 사용을 얻는 것은 생각보다 까다 롭습니다. 내가 찾을 수있는 추론 좋은 방법 은 다음과 같습니다.
echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc
여기서 "PROCESS"는 검사 할 프로세스의 이름이고 "TYPE"은 다음 중 하나입니다.
Rss
: 상주 메모리 메모리,이 프로세스가 다른 프로세스와 공유하는 모든 메모리를 포함하여 프로세스가 사용하는 모든 메모리. 스왑은 포함되지 않습니다.Shared
:이 프로세스가 다른 프로세스와 공유하는 메모리;Private
:이 프로세스에서 사용하는 개인 메모리, 여기에서 메모리 누수를 사용할 수 있습니다.Swap
: 프로세스에서 사용하는 스왑 메모리;Pss
: Proportional Set Size, 좋은 전체 메모리 표시기. 공유를 위해 조정 된 Rss입니다. 프로세스에 개인용 1MiB가 있고 다른 10 개 프로세스간에 공유되는 20MiB가있는 경우 Pss는 1 + 20/10 = 3MiB입니다.
다른 유효한 값은 (즉, 거의 의미가없는 가상 크기) 및 (현재 참조되거나 액세스 된 메모리 양)입니다.Size
Referenced
당신은 사용할 수 있습니다 watch
또는 다른 bash는 펼쳐져 있습니다.-Fu는 모니터링 할 공정을 감시 할 수 있습니다.
자세한 정보 smaps
: http://www.kernel.org/doc/Documentation/filesystems/proc.txt .
대답이 왜 그렇게 복잡해 보이는지 모르겠습니다.이 작업을 수행하는 것은 매우 간단합니다 ps
.
mem()
{
ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i $@ | awk '{printf $1/1024 "MB"; $1=""; print }'
}
사용 예 :
$ mem mysql
0.511719MB 781 root /bin/sh /usr/bin/mysqld_safe
0.511719MB 1124 root logger -t mysqld -p daemon.error
2.53516MB 1123 mysql /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
를 사용 ps
하여 응용 프로그램의 프로세스 ID를 다음 사용합니다 top -p1010
(실제 프로세스 ID를 1010으로 대체). RES 열은 사용 된 실제 메모리이고 VIRT 열은 라이브러리 및 스왑 된 메모리를 사용하여 포함합니다.
더 많은 정보는 "맨 탑"을 사용하여 사용할 수 있습니다.
먼저 pid를 얻으십시오.
ps ax | grep [process name]
그리고 :
top -p PID
동시에 다양한 프로세스를 볼 수 있습니다.
top -p PID1 -p PID2
pmap 을 사용 하여 메모리 보관을보고 할 수 있습니다 .
개요 :
pmap [ -x | -d ] [ -q ] pids...
보다 우아한 접근 방식 :
echo "Memory usage for PID <>:"; for mem in {Private,Rss,Shared,Swap,Pss};do grep $mem /proc/<pid>/smaps | awk -v mem_type="$mem" '{i=i+$2} END {print mem_type,"memory usage:"i}' ;done
감사합니다. 나는 이것을 사용하여 프로세스와 메모리를 관찰하는 데 사용할 수있는 간단한 bash 펼쳐보기를 만들었습니다.
$ watchmypid.sh보기
#!/bin/bash
#
PROCESSNAME=changethistoyourprocessname
MYPID=`pidof $PROCESSNAME`
echo "=======";
echo PID:$MYPID
echo "--------"
Rss=`echo 0 $(cat /proc/$MYPID/smaps | grep Rss | awk '{print $2}' | sed 's#^#+#') | bc;`
Shared=`echo 0 $(cat /proc/$MYPID/smaps | grep Shared | awk '{print $2}' | sed 's#^#+#') | bc;`
Private=`echo 0 $(cat /proc/$MYPID/smaps | grep Private | awk '{print $2}' | sed 's#^#+#') | bc;`
Swap=`echo 0 $(cat /proc/$MYPID/smaps | grep Swap | awk '{print $2}' | sed 's#^#+#') | bc;`
Pss=`echo 0 $(cat /proc/$MYPID/smaps | grep Pss | awk '{print $2}' | sed 's#^#+#') | bc;`
Mem=`echo "$Rss + $Shared + $Private + $Swap + $Pss"|bc -l`
echo "Rss " $Rss
echo "Shared " $Shared
echo "Private " $Private
echo "Swap " $Swap
echo "Pss " $Pss
echo "=================";
echo "Mem " $Mem
echo "=================";
사용 top
또는 htop
은 "RES"(상주 메모리 크기) 열 및주의하십시오.
원하는 도구는 ps입니다. Java 프로그램이 수행하는 작업에 대한 정보를 얻으려면 다음을 수행하십시오.
ps -F -C java
http에 대한 정보를 얻으려면 :
ps -F -C httpd
이 프로그램을 실행하기 전에 프로그램이 종료 될 때까지 실행하십시오.
while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
pmap
+ 를 사용할 수 있습니다 awk
.
우리는 아마도 아래 RSS
예제 pmap
출력 (82564) 의 마지막 줄에있는 세-th 열인 메모리에 관심이 있습니다.
$ pmap -x <pid>
Address Kbytes RSS Dirty Mode Mapping
....
00007f9caf3e7000 4 4 4 r---- ld-2.17.so
00007f9caf3e8000 8 8 8 rw--- ld-2.17.so
00007fffe8931000 132 12 12 rw--- [ stack ]
00007fffe89fe000 8 8 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 688584 82564 9592
그런 다음 Awk를 사용하여 해당 값을 추출합니다.
$ pmap -x <pid> | awk '/total/ { print $4 "K" }'
pmap
값은 킬로바이트에 있습니다. 메가 바이트 단위로 원하는 경우 다음과 같이 할 수 있습니다.
$ pmap -x <pid> | awk '/total/ { print $4 / 1024 "M" }'
추적 할 현재 또는 장기 실행 프로세스가없는 경우 /usr/bin/time
.
이것은 Bash와 동일하지 않습니다 time
.
예
# /usr/bin/time -f "%M" echo
2028
이것은 "수명 동안 프로세스의 최대 상주 세트 크기 (KB)"입니다 (맨 페이지에서 인용). 즉, top
et al.의 RES와 동일 합니다.
더 많은 것을 얻을 수 있습니다 /usr/bin/time
.
# /usr/bin/time -v echo
Command being timed: "echo"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1988
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 77
Voluntary context switches: 1
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
다양한 셸 스크립트로 이러한 모든 복잡한 답변을 제공하는 이유는 무엇입니까? htop을 사용하면 크기가 자동으로 변경되며 표시 할 정보를 선택할 수 있으며 터미널에서 작동하므로 데스크톱이 필요하지 않습니다. 예 : htop -d8
사용하다
- ps u`pidof $ TASKS_LIST` 또는 ps u -C $ TASK
- ps xu-정렬 % mem
- ps h -o pmem -C $ TASK
예:
ps-of()
{
ps u `pidof "$@"`
}
$ ps-of firefox
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
const 18464 5.9 9.4 1190224 372496 ? Sl 11:28 0:33 /usr/lib/firefox/firefox
$ alias ps-mem="ps xu --sort %mem | sed -e :a -e '1p;\$q;N;6,\$D;ba'"
$ ps-mem
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
const 3656 0.0 0.4 565728 18648 ? Sl Nov21 0:56 /usr/bin/python /usr/lib/ubuntuone-client/ubuntuone-syncdaemon
const 11361 0.3 0.5 1054156 20372 ? Sl Nov25 43:50 /usr/bin/python /usr/bin/ubuntuone-control-panel-qt
const 3402 0.0 0.5 1415848 23328 ? Sl Nov21 1:16 nautilus -n
const 3577 2.3 2.0 1534020 79844 ? Sl Nov21 410:02 konsole
const 18464 6.6 12.7 1317832 501580 ? Sl 11:28 1:34 /usr/lib/firefox/firefox
$ ps h -o pmem -C firefox
12.7
참고 URL : https://stackoverflow.com/questions/3853655/in-linux-how-to-tell-how-much-memory-processes-are-using
'ProgramingTip' 카테고리의 다른 글
차이를 반환하는 2 개의 배열 비교 (0) | 2020.12.02 |
---|---|
iOS에서 긴 작업을 할 때 "오버레이"로드 (0) | 2020.12.02 |
Windows 8/10에서 NetBeans IDE 확장 (0) | 2020.12.02 |
프로그래밍 방식으로 UICollectionViewCell 너비 및 높이를 설정하는 방법 (0) | 2020.12.02 |
android : actionBarStyle에는 API 레벨 11이 필요합니다. (0) | 2020.12.02 |