cgroup v1 vs v2 — PSI와 메모리 압력

기초·개념2분조회

쿠버네티스에서 requests/limits 를 걸면, 그건 결국 리눅스 cgroup 으로 구현됩니다. cgroup 이 컨테이너가 쓸 수 있는 CPU·메모리를 제한하는 커널 기능입니다. 이 cgroup 이 v1 에서 v2 로 넘어오며 바뀐 것 중 실무에서 제일 큰 건 PSI 입니다.

v1 — 리소스별로 갈라진 트리

cgroup v1 은 컨트롤러(메모리·CPU·blkio 등)마다 별도의 계층 트리를 가집니다. 메모리 트리 따로, CPU 트리 따로입니다. 그래서 한 컨테이너의 자원을 보려면 여러 트리를 오가야 하고, 런타임마다 이 트리를 다루는 방식이 달라 일관성이 떨어졌습니다.

v2 — 하나의 트리로 통합, 그리고 PSI

cgroup v2 는 이 컨트롤러들을 하나의 통합 트리로 합칩니다. 한 그룹 아래에서 메모리·CPU 를 같이 봅니다.

여기에 v2 가 들여온 게 PSI(Pressure Stall Information) 입니다. PSI 는 “자원이 부족해서 작업이 얼마나 지연되고 있는가” 를 수치로 알려줍니다. 메모리 PSI 를 보면, 프로세스들이 메모리를 못 구해 얼마나 멈춰 있었는지가 나옵니다.

PSI의 중요성 — OOM 이전 감지

v1 에서 메모리 부족은 대개 OOM Kill 로 드러납니다. 한계에 부딪혀 커널이 프로세스를 죽인 뒤에야 “메모리가 모자랐구나” 를 압니다. 사후 대응입니다.

PSI 가 있으면 kubelet 이 OOM 이 나기 전에 메모리 압력이 올라가는 걸 감지하고 미리 반응할 수 있습니다. 죽고 나서가 아니라, 죽기 전에 압력을 읽는 겁니다. 노드가 메모리 압박 상태인지 판단하는 근거가 “죽었나/안 죽었나” 에서 “얼마나 눌리고 있나” 로 바뀝니다.

AL2023 같은 새 이미지가 의미 있는 이유

새 노드 OS(예: Amazon Linux 2023)로 올릴 때 겉으로는 yumdnf, 커널 버전 상승 정도로 보입니다. 하지만 그 밑에서 cgroup v2 가 기본이 되는 게 더 큰 변화입니다. v2 + PSI 위에서 kubelet 의 자원 압력 판단이 정교해지기 때문입니다.

v1의 사후 OOM, v2의 사전 압력(PSI)

cgroup 은 쿠버네티스 리소스 제한의 실제 구현체입니다. v1 은 리소스별로 트리가 쪼개져 있고 메모리 부족을 OOM 으로 사후에 알게 됩니다. v2 는 트리를 통합하고 PSI 로 압력을 미리 보여줘서, 죽기 전에 손쓸 시간을 줍니다. 노드 OS 업그레이드가 단순 패키지 변경 이상인 건 이 층이 같이 바뀌기 때문입니다.

  1. 불러오는 중