[Linux] Top 항목에서 메모리 사용 살펴보기 Computer Tip

top 이라는 리눅스 명령어가 있습니다.
각종 CPU, 메모리 등의 사용률을 TopN 순으로 표시를 해 주는 것이지요.

그런데 위와 같은 곳에서 메모리와 관련된 곳은,

위와 같이 VIRT, RES, SHR, %MEM 과 같은 컬럼이 메모리와 관련되어 있습니다.
CPU 등에 비하여 내용이 꽤 많습니다.

이제 다음과 같은 질문이 당연히 나올 수 있는데...


상단의 터미널에서 살펴본 첫번째 Java는 3.2G의 VIRT를 가지고 있군요....

결론적으로 말씀드리면, 가상메모리 VIRT 자체는 실제 메모리를 이용하고 있는 것이 아니기 때문에 신경 쓸 이유는 없다 입니다.
실제로 물리적 메모리를 사용하고 있는 항목은 RES 필드에 있는 내용입니다.

그런데 재미있는 것은 mongod와 같은 프로세스는,

위와 같이 가상메모리(VIRT)는 4.9G를 이용하고 있는데 실제 메모리(RES)는 38M를 가리키고 있습니다.
이 이유는 가상메모리가 "Addressing space"를 가리키기 때문이라고 합니다.

예를 들어 몽고DB가 4G짜리 파일에 메모리맵(mmap)을 통한 작업을 하면,
이 address space는 mmap 된 전체 파일의 크기가 되기 때문에 가상 메모리가 무척 크게 보이는 이유입니다.
하지만 실제로는 커널이 접근하는 address의 크기에 따라서 page 되기 때문에 실제 이용하는 메모리는
얼마큼의 서로 다른 페이지를 이용하는가에 따라 틀립니다.

따라서 실제 메모리 사용률은 1/100 도 안되는 38M 만 이용하게 되는 이유이지요.
가상 메모리는 실제 그 만큼의 주소를 가질 수 있다라고 이해를 하시고, 실제 메모리는 RES 필드를 보시면 됩니다.

다시 top 이 보여주고 있는 목록에서 디폴트는 CPU 이용을 제일 많이 하는 프로세스가 보이는데,
'F' 키를 누르면,

위와 같이 소팅컬럼이 보입니다. 이곳에서, 'q' 키를 누르면,

실제 메모리 사용율 (RES)로 소팅을 하며,

위와 같이 정렬되어 실제 메모리를 많이 사용하고 있는 프로세스 별로 살펴볼 수 있습니다.

위와 같은 top 명령은 일반 linux 인 경우이고, Embeded linux에서 이용하는 busybox의 top 명령은 약간 다릅니다.

busybox의 top 명령을 내리면,

위와 같이 디폴트 CPU 정렬의 모습이 보입니다. (프로세스 명은 보안을 위하여 제외시켰습니다)

여기에서 VSZ가 가상메모리 크기입니다.
앞서 언급한 것처럼 이것만 가지고는 실제 메모리 이용율을 알 수는 없습니다.

여기에서 's' 키를 누르면,

위와 같이 VSZRW (현재 읽고 쓰는 가상메모리 영역) 크기가 나오는데,
's'키를 한번 더 누르면,

이 RSS 컬럼별로 정렬이 되는데,
이것이 바로 실제 메모리를 많이 사용하는 있는 순으로 표시가 됩니다.

즉, busybox 인 경우, top을 실행하고 'ss'를 눌러 위와 같이 실제 사용 메모리를
확인할 수 있습니다.


어느분께는 도움이 되셨기를....

덧글

  • 2014/10/14 10:58 # 삭제 답글

    좋은 쓰기까지, 나는 자신의 블로그를 정기적으로 방문자 오전, 우수한 운영까지 유지하고, 그것은 긴 시간 동안 정기적 인 방문자가 될 것입니다.
  • 큐브 2014/11/24 15:51 # 답글

    완전 유용한 정보 감사합니다~ (--)(__)
  • 지훈현서아빠 2014/11/24 16:20 #

    도움이 되셨다니 저의 보람입니다~
  • 닉스 2015/07/09 15:07 # 삭제 답글

    많은 도움 되었습니다.

    감사합니다.
  • 지훈현서아빠 2015/07/10 09:13 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • ㅁㅁㅁ 2016/10/06 12:05 # 삭제 답글

    도움이 되었습니다
  • 지훈현서아빠 2016/10/06 12:51 #

    도움이 되셨다니 저의 보람입니다.
  • 차차 2017/09/05 16:18 # 삭제 답글

    좋은 정보 잘 보았습니다.
    도움이 많이 되었습니다.
    고맙고 감사한 마음을 전합니다.
    남은하루도 즐겁게 보내세요^^
  • 지훈현서아빠 2017/09/05 16:54 #

    도움이 되셨다면 저의 보람입니다~ ^^
  • 땡큐맨 2018/01/04 09:53 # 삭제 답글

    top 을 이해하는데 도움이 되었습니다. 감사합니다!
    새해 복 많이 받으세요
  • 지훈현서아빠 2018/01/04 15:50 #

    도움이 되셨다니 저의 보람입니다~
  • 하다 2019/09/17 18:53 # 삭제 답글

    저 너무 궁금한게 생겨서 댓글 답니다.
    저는 지금 서버에서 TOP명령 쳤을때 JAVA가 23GB가 잡히거든요??? 그럼 말씀대로면 VIRT는 실제가 아니라 가상이고 실제는 얼마나 다른 페이지를 사용하냐에 따라 RES 사용량이 중요하다는 것까지 이해가 잘 되는데....
    그럼 만약 서로 다른 10개의 프로젝트의 가상메모리가 전부 20GB 가 잡힌다면 그것도 전혀 상관이 없는건가요?

    이게 왜 궁금하냐면 저의 선임님께서 JAVA가 swap영역(VIRT)을 너무 많이 차지해서
    다른 프로세스가 swap영역을 사용못해서 느려진다고 하더라구요..
  • 지훈현서아빠 2019/09/18 03:33 #

    SWAP 영역은 말 그대로 실제 메모리가 꽉 차면 디스크로 In/Out 을 하는 영역이라고 봐야 되겠지요.
    대신 속도는 무척 느려지겠구요.
    JAVA 와 같은 개념의 Sandbox 인 경우, 그 안에서 메모리를 많이 사용한다면 처음부터 충분한
    메모리를 지정해야겠고, 그게 아니면 SWAP 영역을 이용하겠는데,
    결론은 JAVA와 같이 메모리 관리를 알아서 해 주는 경우의 프로그램 언어도
    메모리를 절약하면서 사용해야 좋은 구현체가 된다고 답해드리는게
    맞지 않을까 싶습니다.

    도움이 되셨기를 ..
  • 하다 2019/09/18 13:46 # 삭제 답글

    댓글 감사합니다!!!
    그럼 혹시... 보통 웹 프로젝트를 올리면 1~4GB정도 VIRT수치가 나타나는데... 지금 제 프로젝트에서는 JAVA의 VIRT가 23GB가 잡히는 이유는 뭘까요?.. 딱히 큰일을 하는 웹서버도 아닙니다. 그냥 기본 프로젝트인 hello world를 띄워도 그렇거든요...
댓글 입력 영역

구글애드텍스트