ProgramingTip

Linux에서 사용중인 메모리 프로세스의 양을 확인하는 방법은 무엇입니까?

bestdevel 2020. 12. 2. 21:39
반응형

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입니다.

다른 유효한 값은 (즉, 거의 의미가없는 가상 크기) 및 (현재 참조되거나 액세스 된 메모리 양)입니다.SizeReferenced

당신은 사용할 수 있습니다 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)"입니다 (맨 페이지에서 인용). 즉, topet 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

반응형