Ubuntu(Devian Linux)에서 특정 프로세스의 메모리 사용량을 확인하는 다양한 방법을 알아보겠습니다.

메모리 사용량을 보여줄 때 RSS(Resident Set Size)로 표현되는데 RSS를 잘 모르신다면 아래 내용을 참고하세요.

  • RSS는 프로세스가 실제로 물리 메모리(RAM)에 상주하는 메모리의 크기를 나타냅니다.
  • RSS는 프로세스가 현재 사용하고 있는 물리적 메모리 양을 측정하며, 킬로바이트(KB) 단위로 표시됩니다.
  • RSS에는 공유 메모리 영역도 포함될 수 있습니다. 여러 프로세스가 같은 물리적 메모리 페이지를 공유하는 경우, 각 프로세스의 RSS에 모두 중복으로 포함됩니다.
  • RSS는 물리 메모리에 상주하는 메모리만 포함되며, 디스크에 스왑된 메모리는 포함되지 않습니다.

1. TOP 명령어를 이용한 방법

top 명령어는 실시간으로 프로세스 별 메모리 사용량을 보여줍니다.

  • 메모리 사용량이 높은 순서대로 정렬해서 보여줌
  • 출력되는 결과에서 메모리는 RES(Resident Set Size)와 SHR(Shared Memory Size)로 확인
  • “shift + m”를 입력하면 메모리 사용량 기준으로 정렬 (m은 소문자로 입력)
  • “shift + p”를 입력하면 CPU 사용량 기준으로 정렬
  • “shift + n”을 입력하면 PID 순서로 정렬
  • “shift + t”을 입력하면 PID 순서로 정렬
devjss@mjs:~$ top
top - 14:54:58 up 1 day, 18:21,  1 user,  load average: 0.20, 0.17, 0.09
Tasks:  31 total,   1 running,  30 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.7 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  31739.2 total,  27274.7 free,   3257.5 used,   1207.0 buff/cache
MiB Swap:   8192.0 total,   8192.0 free,      0.0 used.  28027.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  166072  11332   8220 S   0.0   0.0   0:00.33 systemd
      2 root      20   0    2476   1436   1320 S   0.0   0.0   0:00.00 init-systemd(Ub
      7 root      20   0    2504    144    132 S   0.0   0.0   0:00.00 init
     42 root      19  -1   39660  15996  14880 S   0.0   0.0   0:00.10 systemd-journal
     62 root      20   0   22220   6132   4512 S   0.0   0.0   0:00.11 systemd-udevd
     76 root      20   0    4492    200     48 S   0.0   0.0   0:00.00 snapfuse
     77 root      20   0    4624    168     16 S   0.0   0.0   0:00.00 snapfuse
     79 root      20   0    4760   1876   1336 S   0.0   0.0   0:00.49 snapfuse
     82 root      20   0    4768   1952   1412 S   0.0   0.0   0:01.44 snapfuse
     83 root      20   0    4956   1856   1364 S   0.0   0.0   0:00.68 snapfuse
    178 systemd+  20   0   25664  13680   9288 S   0.0   0.0   0:00.10 systemd-resolve
    235 root      20   0    4304   2676   2432 S   0.0   0.0   0:00.00 cron
    236 message+  20   0    8584   4568   4028 S   0.0   0.0   0:00.01 dbus-daemon
    242 root      20   0   30104  18864  10052 S   0.0   0.1   0:00.06 networkd-dispat
    246 syslog    20   0  222400   7080   4464 S   0.0   0.0   0:00.01 rsyslogd
    248 root      20   0 1984488  33948  16844 S   0.0   0.1   0:00.27 snapd
    250 root      20   0   15316   7320   6388 S   0.0   0.0   0:00.06 systemd-logind

2. ps 명령어를 이용한 방법

ps 명령어는 현재 실행 중인 프로세스의 정보를 출력합니다. aux 옵션을 함께 사용하면 프로세스의 메모리 정보도 함께 출력합니다.

  • --sort=-%mem은 프로세스들을 메모리 크기로 정렬
  • 출력 결과에서 %MEM은 메모리 사용률(%), RSS는 실제 메모리 사용량을 의미
devjss@mjs:~$ ps aux --sort=-%mem
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         380  0.3  0.2 153776 70424 ?        Sl   14:54   0:01 /snap/ubuntu-desktop-installer/1276/usr/bin/python3.1
root         248  0.0  0.1 1984488 41632 ?       Ssl  14:54   0:00 /usr/lib/snapd/snapd
root         468  0.2  0.1  43428 37748 ?        S    14:54   0:01 python3 /snap/ubuntu-desktop-installer/1276/usr/bin/c
root         289  0.0  0.0 107220 21284 ?        Ssl  14:54   0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unatt
root         242  0.0  0.0  30104 18864 ?        Ss   14:54   0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-s
root          42  0.0  0.0  47856 16036 ?        S<s  14:54   0:00 /lib/systemd/systemd-journald
systemd+     178  0.0  0.0  25664 13680 ?        Ss   14:54   0:00 /lib/systemd/systemd-resolved
root           1  0.0  0.0 166072 11332 ?        Ss   14:54   0:00 /sbin/init
devjss       446  0.0  0.0  17168  9132 ?        Ss   14:54   0:00 /lib/systemd/systemd --user
syslog       246  0.0  0.0 222400  9068 ?        Ssl  14:54   0:00 /usr/sbin/rsyslogd -n -iNONE
root         250  0.0  0.0  15316  7320 ?        Ss   14:54   0:00 /lib/systemd/systemd-logind

3. /proc/[pid]/status 를 이용한 방법

프로세스가 생성되면 /proc/[pid]/status 경로에 파일이 만들어지며, 프로세스의 상태 정보가 기록됩니다.

PID를 알고 있다면 다음과 같이 cat으로 해당 프로세스의 정보를 출력할 수 있습니다.

cat /proc/[PID]/status

PID 189의 정보를 출력해보면, 메모리 사용량 정보도 출력되는 것을 볼 수 있습니다.

  • VmRSS : 실제 물리적 메모리 크기 (KB)
  • VmSize : 프로세스에 할당된 가상메모리 크기 (KB)
devjss@mjs:~$ cat /proc/189/status
Name:   dbus-daemon
Umask:  0022
State:  S (sleeping)
Tgid:   189
Ngid:   0
Pid:    189
PPid:   1
TracerPid:      0
Uid:    101     101     101     101
Gid:    101     101     101     101
FDSize: 128
Groups:
NStgid: 189
NSpid:  189
NSpgid: 189
NSsid:  189
VmPeak:     9668 kB
VmSize:     9660 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:      5144 kB
VmRSS:      5144 kB
RssAnon:             724 kB
RssFile:            4420 kB
RssShmem:              0 kB
VmData:      760 kB
VmStk:       132 kB
VmExe:       148 kB
VmLib:      6020 kB
VmPTE:        56 kB
VmSwap:        0 kB

grep을 사용하여 메모리 항목만 확인할 수도 있습니다.

devjss@mjs:~$ cat /proc/189/status | grep -i vmrss
VmRSS:      5144 kB

devjss@mjs:~$ cat /proc/189/status | grep -i vmsize
VmSize:     9660 kB

4. pmap을 이용한 방법

pmap은 특정 프로세스의 메모리 맵을 출력합니다. 또한, 가상메모리 크기 및 RSS도 함께 출력합니다.

  • -x 옵션은 디테일한 정보 함께 출력
  • Kbytes 열은 가상 메모리 크기(KB)
  • RSS 열은 RAM에 매핑된 메모리 크기(KB)
  • Mapping 열은 메모리에 매핑된 파일
  • anon은 익명(anonymous) 메모리 매핑, 특정 파일에 연결되지 않고 일시적으로 사용되는 메모리 영역
  • Mode 열은 메모리 매핑의 접근 권한(r: 읽기, w: 쓰기, x: 실행)
devjss@mjs:~$ pmap -x 449032
449032:   npm start
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000   71140   30564       0 r-x-- node
0000000004b78000      16      16       8 r---- node
0000000004b7c000      96      96      68 rw--- node
....
00007f1b89f94000       8       8       8 rw--- ld-linux-x86-64.so.2
00007fff8582c000     132      64      64 rw---   [ stack ]
00007fff85890000      16       0       0 r----   [ anon ]
00007fff85894000       8       4       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB          708520   57064   22580