본문 바로가기
Hardware

[Hardware]물리 메모리와 가상 메모리

by Yoon_estar 2025. 1. 30.
728x90

1. 물리 메모리와 가상 메모리

1.1 물리 메모리

  • 정의
    • 실제 하드웨어적으로 존재하는 RAM
  • 특징
    • 데이터와 애플리케이션 실행에 직접 사용
    • 속도가 빠르지만 용량이 제한적

1.2 가상 메모리

  • 정의
    • 운영체제가 디스크 공간을 활용하여 물리 메모리를 보조하는 메모리 관리 기법
  • 특징
    • 물리 메모리의 부족을 보완
    • 디스크 I/O를 통해 메모리를 확장하지만 성능 저하를 유발할 수 있음
    • HPC 환경에서는 가능한 가상 메모리 사용을 최소화해야함

2. 메모리 모니터링 도구

2.1 vmstat

# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 6  0      0 160760 776224 1721932    0    0     5    93 5606    9  2  2 97  0  0  0
  • 주요 항목
    • free : 사용 가능한 물리 메모리
    • buff : 쓰기 작업을 위해 예약된 메모리
    • cache : 읽기 작업을 위해 캐싱된 메모리
    • swpd : 사용 중인 스왑 메모리
    • si / so : 스왑 메모리의 입출력 속도

2.2 ps 와 top

# ps aux | grep docker
root        1247  0.0  0.2 1579544 41260 ?       Ssl  Jan08  10:24 /usr/bin/dockerd --cluster-store=etcd://192.168.207.10:3001 --cluster-advertise=192.168.207.10:3000 --config-file /APP/docker/daemon.json --default-ulimit nofile=650000 --default-ulimit nproc=8100
root        2916  0.0  0.1 2028424 24244 ?       Ssl  Jan08   1:00 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
root       13356  0.0  0.0 1308284 5200 ?        Sl   Jan08   0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5000 -container-ip 172.17.0.2 -container-port 5000
root       13365  0.0  0.0 1087088 5176 ?        Sl   Jan08   0:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 5000 -container-ip 172.17.0.2 -container-port 5000
root       13393  0.0  0.0 1236720 9308 ?        Sl   Jan08   0:35 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 385cdb7deae094dcff649c790aa741e0401d9db5971a7d7492f8d3a0d6275e44 -address /var/run/docker/containerd/containerd.sock
root       13414  0.0  0.0  22740  5592 ?        Ssl  Jan08   0:31 registry serve /etc/docker/registry/config.yml
root     1682673  0.0  0.0 222016  1220 pts/7    S+   12:08   0:00 grep --color=auto docker
# top
top - 12:08:52 up 13 days,  1:20,  2 users,  load average: 2.76, 2.64, 2.82
Tasks: 417 total,   1 running, 416 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  1.6 sy,  0.0 ni, 32.8 id, 65.6 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15680.6 total,    452.5 free,   2286.4 used,  12941.7 buff/cache
MiB Swap:  32768.0 total,  31189.8 free,   1578.2 used.  12948.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
1684679 root      20   0  264604   4708   3648 R   6.2   0.0   0:00.01 top
      1 root      20   0  247556  11672   7912 S   0.0   0.1  42:28.86 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.41 kthreadd
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 slub_flushwq
      7 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri
     10 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq
     11 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_rude_
     12 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_trace
     13 root      20   0       0      0      0 S   0.0   0.0   1:29.96 ksoftirqd/0
     14 root      20   0       0      0      0 I   0.0   0.0   4:35.99 rcu_sched

 

2.3 pmap

  • 프로세스 메모리 매핑 확인
# pmap -x 904
904:   /usr/bin/lsmd -d
Address           Kbytes     RSS   Dirty Mode  Mapping
000055e6fa59c000      20      20       0 r-x-- lsmd
000055e6fa7a0000       4       4       4 r---- lsmd
000055e6fa7a1000       4       4       4 rw--- lsmd
000055e6faf24000     132      56      56 rw---   [ anon ]
00007f2b4d184000      44      44       0 r-x-- libnss_files-2.28.so
00007f2b4d18f000    2048       0       0 ----- libnss_files-2.28.so
00007f2b4d38f000       4       4       4 r---- libnss_files-2.28.so
00007f2b4d390000       4       4       4 rw--- libnss_files-2.28.so
00007f2b4d391000      24       0       0 rw---   [ anon ]
00007f2b4d397000    1844    1428       0 r-x-- libc-2.28.so
00007f2b4d564000    2044       0       0 ----- libc-2.28.so
00007f2b4d763000      16      16      16 r---- libc-2.28.so
00007f2b4d767000       8       8       8 rw--- libc-2.28.so
00007f2b4d769000      16      16      16 rw---   [ anon ]
00007f2b4d76d000      44      44       0 r-x-- libconfig.so.9.2.0
00007f2b4d778000    2048       0       0 ----- libconfig.so.9.2.0
00007f2b4d978000       4       4       4 r---- libconfig.so.9.2.0
00007f2b4d979000       4       0       0 rw---   [ anon ]
00007f2b4d97a000     188     188       0 r-x-- ld-2.28.so
00007f2b4db8c000      20      12      12 rw---   [ anon ]
00007f2b4dba9000       4       4       4 r---- ld-2.28.so
00007f2b4dbaa000       8       8       8 rw--- ld-2.28.so
00007ffe44d48000     132       8       8 rw---   [ stack ]
00007ffe44d71000      16       0       0 r----   [ anon ]
00007ffe44d75000       8       4       0 r-x--   [ anon ]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB            8692    1876     148

 

  • 활용법
# pidof containerd
# pmap -x `pidof containerd` | sort -k 3 -n -r | head

 

3. 메모리 성능 튜닝

3.1 스왑 메모리 관리

  • 스왑 활성화 / 비활성화
swapon -s
sudo swapoff -a  # 비활성화
sudo swapon -a   # 활성화

 

  • 튜닝
    • vm.swappiness 값을 조정하여 스왑 사용 빈도를 줄
# echo 10 > /proc/sys/vm/swappiness

 

3.2 캐시 및 버퍼 관리

  • 캐시 메모리 확인 및 정리
# free -h
# sudo sync; echo 3 > /proc/sys/vm/drop_caches

 

  • 활성 메모리와 비활성 메모리 구분
    • active : 최근 사용된 메모리
    • inactive : 회수 가능한 메모

3.3 NUMA(Node Locality) 정책 활용

  • NUMA는 다중 CPU 코어와 메모리 간의 데이터 전송 병목 현상을 줄이기 위한 구조입니다. 
  • NUMA 바인딩 설정
# numactl --cpunodebind=0 --membind=0 ./[프로그램명]

 

3.4 메모리 오버커밋 조정

  • 메모리 초과 할당 방지
# echo 2 > /proc/sys/vm/overcommit_memory

 

  • 옵션
    • 0 : 커널이 오버커밋 여부를 판단
    • 1 : 무조건 오버커밋 허용
    • 2 : 물리 메모리 + 스왑 크기 내에서만 허용

4. HPC 환경에서의 메모리 활용 사례

4.1 대규모 계산 작업

  • 문제점 : 메모리 부족으로 인한 swap 사용 증가
  • 해결책 
    • 메모리 프로파일링 도구(pmap, top)를 활용해 병목 프로세스 파악
    • 캐시 메모리 정리 및 NUMA 정책 최적화

4.2 I/O 집약적 작업

  • 문제점 : I/O 대기 시간이 메모리 캐시 효율성을 감소시킴
  • 해결책
    • buff, cache 메모리 사용량 모니터링
    • 고속 스토리지 (NVME SSD)로 업그레이드

4.3 컨테이너 기반 워크로드

  • 문제점 : 컨테이너 간 메모리 충돌 및 과도한 사용
  • 해결책
    • 각 컨테이너에 메로리 제한 설정
# docker run --memory="4g" [이미지명]