반응형

우분투를 포함하여 리눅스에서 특정 프로세스의 메모리 사용량을 측정하는 방법입니다. 



2020. 7. 5      최초작성

2020. 10. 24  최종작성




명령어 ps MAN 페이지의 STANDARD FORMAT SPECIFIERS 항목을 보면  

https://man7.org/linux/man-pages/man1/ps.1.html 


메모리 측정 방법으로 다음 3개의 옵션을 사용할 수 있습니다.

확인하지 못한 항목이 더 있을 수 있습나다.


현재는 size를 사용하고 있습니다. 

이 방법이 문제가 있는 듯합니다. 

ps -eo size


free 명령으로 확인한 전체 사용 메모리를 일정 범위를 유지하는데 

size를 사용하여 측정한 값은 계속 증가합니다. 


size 대신에 rss, vsz를 사용해야 할듯한데 확인 중입니다. 


rss         RSS       resident set size, the non-swapped physical

memory that a task has used (in kilobytes).

(alias rssize, rsz)

 

size        SIZE      approximate amount of swap space that would be

required if the process were to dirty all

writable pages and then be swapped out.  This

number is very rough!


vsz         VSZ       virtual memory size of the process in KiB

(1024-byte units).  Device mappings are

currently excluded; this is subject to change.

(alias vsize).

 


리눅스 특성상 특정 프로세스가 사용하는 메모리량을 정확히 측정하기 힘든듯합니다. 

프로세스 혼자 사용하는 메모리도 있고 다른 프로세스와 공유하는 메모리도 있습니다. 

또한 일부는 저장공간에 스왑되기도 합니다. 





다음 코드를 적당한 파일 이름으로 저장합니다. 

여기에서는 check_memory.sh로 저장하고 진행합니다. 

두개의 인자를 입력 안한 경우 처리는 포함되어 있지 않습니다. 입력된 인자 개수가 2개가 아닌 경우 간단히 사용법을 출력하도록 수정하면 됩니다.


while true; do
DATE=$(date '+%y/%m/%d %H:%M:%S');
echo $DATE  `ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |    cut -d "" -f2 | cut -d "-" -f1 | grep $1 | grep -v grep`;
free -m | grep -v Swap;
echo "";
sleep $2; done




실행 가능하도록 파일의 퍼미션을 변경합니다. 


$ chmod +x check_memory.sh




감시하려는 프로세스의 이름과 얼마의 간격으로 메모리를 출력할지를 초 단위로 입력한 것을 인자로 사용하여 스크립트를 실행합니다. 

여기에서는 감시하려는 프로세스 이름을 main으로 하고 1초 간격으로 메모리 상태를 출력하도록 합니다.


다음처럼 지정한 main 프로세스 메모리와 전체 시스템의 메모리 상태를 1초 간격으로 출력해줍니다. 


$ ./check_memory.sh main 1

20/07/05 13:21:49 1506.91 Mb ./main

              total        used        free      shared  buff/cache   available

Mem:           4944        1569         833          61        2541        2990


20/07/05 13:21:50 1506.91 Mb ./main

              total        used        free      shared  buff/cache   available

Mem:           4944        1570         832          61        2541        2989


20/07/05 13:21:51 1506.91 Mb ./main

              total        used        free      shared  buff/cache   available

Mem:           4944        1570         833          61        2541        2989


20/07/05 13:21:52 1506.91 Mb ./main

              total        used        free      shared  buff/cache   available

Mem:           4944        1570         832          61        2541        2989


^C  Ctrl + C를 눌러 종료시 까지 실행됩니다. 





다음처럼 스크립트 실행시  | tee output.log를 추가하면 다음처럼 화면에도 메모리 사용량을 보여주고 


$ ./check_memory.sh main 1| tee output.log

20/07/05 13:27:09 1506.91 Mb ./main

              total        used        free      shared  buff/cache   available

Mem:           4944        1568         833          61        2541        2990


20/07/05 13:27:10 1506.91 Mb ./main

              total        used        free      shared  buff/cache   available

Mem:           4944        1569         833          61        2541        2990


^C




동시에 지정한 파일 output.log에도 메모리 사용량이 저장됩니다. 


$ cat output.log 

20/07/05 13:27:09 1506.91 Mb ./main

              total        used        free      shared  buff/cache   available

Mem:           4944        1568         833          61        2541        2990


20/07/05 13:27:10 1506.91 Mb ./main

              total        used        free      shared  buff/cache   available

Mem:           4944        1569         833          61        2541        2990



참고

https://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or-process 

https://askubuntu.com/questions/420981/how-do-i-save-terminal-output-to-a-file 




반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts