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" [이미지명]
'Hardware' 카테고리의 다른 글
[UPS] HPC 엔지니어를 위한 UPS 시스템 이해하기 (0) | 2025.02.24 |
---|---|
[HPE] HPE 서버 IPMI 비밀번호 초기화 (0) | 2025.02.22 |
[Linux] Intel CPU 클럭 속도와 조정 방법 (0) | 2025.01.27 |
[Hardware]실제 사이트에서 유의해야 할 네트워크 설정 (0) | 2024.12.20 |
[hardware]서버 냉각 방식 (0) | 2024.11.20 |