리눅스 시스템 메모리 이해 (free 명령어)
controlplane ~ ➜ free -m
total used free shared buff/cache available
Mem: 209558 58317 2935 378 148306 149508
Swap: 0 0 0
Bash
복사
free 수행 예
리눅스는 성능 최적화를 위해 남는 메모리를 캐시(Cache) 영역으로 최대한 활용합니다.
•
Used: 실제 프로세스가 점유 중인 메모리.
•
Free: 완전히 비어 있는 메모리 (단순히 이 수치가 낮다고 메모리가 부족한 것은 아님).
•
Buff/Cache: 디스크 성능 향상을 위한 임시 저장 공간. 응용 프로그램이 메모리를 요청하면 시스템이 이 영역을 반환하여 할당해 줍니다.
•
Available: 시스템이 프로세스에 할당 가능한 실제 여유 공간 (Free + 반환 가능한 Buff/Cache).
컨테이너의 메모리 사용량(working set)
쿠버네티스에서 kubectl top 등으로 확인하는 메모리 수치는 단순 점유량이 아닌 Working Set 기준입니다.
•
정의: 응용 프로그램 작동을 위해 반드시 필요한 메모리 영역 (실제 사용량 + 반환 불가능한 일부 캐시).
•
특징: 메모리가 부족해도 시스템이 강제로 회수할 수 없는 영역이므로, 실제 컨테이너의 메모리 사용량을 판단하는 기준이 됩니다.
controlplane ~ ➜ kubectl top pod -n kube-system
NAME CPU(cores) MEMORY(bytes)
coredns-6799fbcd5-lsstk 3m 18Mi
local-path-provisioner-84db5d44d9-9wwqc 1m 10Mi
metrics-server-67c658944b-qh9qd 6m 22Mi
svclb-traefik-605f6ebc-g8j55 0m 7Mi
traefik-f4564c4f4-29n6w 1m 29Mi
Bash
복사
파드의 메모리 사용량(working set)
리소스 설정: Request와 Limit
•
Request (요청량): 컨테이너 실행을 위해 보장되어야 하는 최소 메모리. 노드 스케줄링의 기준이 되며, 초과 사용 시 노드 자원이 부족하면 파드가 쫓겨날(Evict) 수 있습니다.
•
Limit (제한량): 컨테이너가 사용할 수 있는 최대 메모리. 이 수치를 넘으려고 하면 커널이 OOM(Out Of Memory) Killer를 통해 해당 프로세스를 강제 종료합니다.
•
Limit 미설정 위험: 컨테이너가 노드의 모든 메모리를 점유하여 다른 프로세스나 시스템 전체에 영향을 줄 수 있습니다.
LimitRange를 통한 자동 관리
네임스페이스 단위로 LimitRange를 설정하면, 개별 파드 설정이 누락되더라도 기본값이 자동으로 적용됩니다.
•
작동 방식: LimitRange 객체를 생성한 네임스페이스 내에서 파드 생성 시, 설정된 default와 defaultRequest 값이 리소스 항목에 자동으로 주입됩니다.
•
주요 설정 예시:
◦
default: 메모리 Limit 기본값 (예: 512Mi)
◦
defaultRequest: 메모리 Request 기본값 (예: 256Mi)
LimitRange 설정 예시
네임스페이스 생성
테스트용 네임스페이스 default-mem-example를 생성합니다.
kubectl create namespace default-mem-example
Bash
복사
LimitRange와 Pod 생성
아래 manifest 파일은 디폴트 메모리 request와 limit을 지정합니다.
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
YAML
복사
memory-defaults.yaml
default-mem-example 네임스페이스에 LimitRange 생성합니다.
kubectl apply -f memory-defaults.yaml --namespace=default-mem-example
Bash
복사
이제 default-mem-example 네임스페이스에서 생성된 Pod들은 디폴트 메모리 설정을 적용 받습니다.
default-mem-demo Pod를 실행해 보겠습니다.
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo
spec:
containers:
- name: default-mem-demo-ctr
image: nginx
YAML
복사
memory-defaults-pod.yaml
kubectl apply -f memory-defaults-pod.yaml --namespace=default-mem-example
Bash
복사
Pod의 상세 정보를 확인해보면 디폴트 메모리 설정이 적용된 것을 확인할 수 있습니다.
kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example
containers:
- image: nginx
imagePullPolicy: Always
name: default-mem-demo-ctr
resources:
limits:
memory: 512Mi
requests:
memory: 256Mi
Bash
복사
참조
Kubernetes , Istio 기술 지원을 하였으며, 현재는 Zabbix 기술 지원을 하고 있습니다.
