
메모리가 부족할 때 리눅스는 어떻게 할까
리눅스 서버를 운영하다 보면 메모리가 부족해지는 상황을 만나게 되는데요. 이때 리눅스 커널은 기본적으로 스왑(swap)이라는 메커니즘을 사용해요. 스왑이 뭐냐면, RAM에 있는 데이터 중 당장 안 쓰는 것들을 디스크로 옮겨서 메모리 공간을 확보하는 거예요. 근데 디스크는 RAM보다 훨~씬 느리잖아요. 그래서 스왑이 많이 발생하면 시스템이 눈에 띄게 느려지는 거예요.
이 문제를 좀 덜어주는 기술이 바로 Zswap과 Zram이에요. 둘 다 메모리 압축을 활용하는 건 같은데, 동작 방식이 꽤 달라요. 그런데 이 둘을 혼동하거나 잘못 알고 있는 경우가 많아서, Chris Down이라는 커널 개발자가 오해를 바로잡는 글을 올렸어요.
Zswap은 "캐시"에 가까워요
Zswap부터 볼게요. Zswap은 기존 스왑의 앞단에 위치하는 압축 캐시예요. 이게 뭔 뜻이냐면, 커널이 어떤 메모리 페이지를 스왑 아웃(디스크로 내보내기)하려고 할 때, 바로 디스크에 쓰는 대신 먼저 RAM 안에서 압축해서 보관하는 거예요.
예를 들어볼게요. 원래 4KB짜리 메모리 페이지가 있는데, 이걸 압축하면 1KB로 줄어든다고 해봐요. 그러면 같은 RAM 공간에 4배 더 많은 데이터를 담을 수 있는 거죠. 디스크까지 갈 필요 없이 RAM 안에서 해결되니까 훨씬 빨라요.
핵심은 Zswap이 기존 스왑 디바이스를 대체하는 게 아니라, 그 앞에서 버퍼 역할을 한다는 거예요. 압축된 데이터가 Zswap 풀의 용량을 초과하면, 가장 오래된 데이터는 결국 실제 디스크 스왑으로 내려가요. 그래서 Zswap을 쓰려면 기존 스왑 파티션이나 스왑 파일이 설정되어 있어야 해요.
Zram은 "디스크 없는 스왑"이에요
Zram은 접근 방식이 좀 달라요. Zram은 RAM 안에 압축된 블록 디바이스를 만들어요. 이게 뭐냐면, RAM의 일부를 떼어내서 가상의 디스크처럼 만드는 건데, 거기에 저장되는 데이터는 자동으로 압축되는 거예요. 그리고 이 가상 디스크를 스왑 디바이스로 설정하는 거죠.
즉, Zram을 쓰면 물리적 디스크 스왑 없이도 스왑을 사용할 수 있어요. 모든 스왑 데이터가 RAM 안에 (압축된 형태로) 존재하니까, 디스크 I/O가 전혀 발생하지 않아요. 대신 CPU를 사용해서 압축/해제를 하는 거예요.
그래서 언제 뭘 써야 하나요
여기서 많이 하는 오해가 "Zswap이 무조건 더 좋다" 혹은 "Zram이면 충분하다"라는 거예요.
Zram이 적합한 경우는 디스크가 아예 없거나 매우 느린 환경이에요. 임베디드 시스템, 라즈베리파이 같은 싱글보드 컴퓨터, 또는 디스크 I/O를 최소화하고 싶은 데스크톱 환경에서 좋아요. 물리 스왑을 아예 설정하지 않고 Zram만 쓸 수 있거든요. 최근 Fedora나 Ubuntu 같은 데스크톱 리눅스 배포판들이 기본으로 Zram을 활성화하는 추세예요.
Zswap이 적합한 경우는 이미 디스크 스왑이 설정된 서버 환경이에요. Zswap은 기존 스왑 시스템의 성능을 개선해주는 역할을 하거든요. 스왑 아웃되는 데이터의 상당 부분이 압축 캐시에서 처리되니까, 실제 디스크 스왑 발생 빈도가 줄어들어요.
한 가지 중요한 점은, Zswap과 Zram을 동시에 쓰는 건 일반적으로 권장되지 않아요. 둘 다 활성화하면 메모리 압축이 이중으로 일어나면서 오히려 비효율적이 될 수 있거든요. 하나를 골라서 쓰는 게 좋아요.
흔한 오해 바로잡기
자주 보이는 오해 중 하나가 "압축하면 메모리가 늘어난다"는 거예요. 엄밀히 말하면 물리 메모리 용량이 늘어나는 건 아니에요. 같은 공간에 더 많은 데이터를 담을 수 있게 되는 거지, 마법처럼 RAM이 커지는 건 아니거든요. 그리고 압축률은 데이터 종류에 따라 천차만별이에요. 이미 압축된 데이터(이미지, 동영상 등)는 추가 압축이 거의 안 되고, 텍스트나 반복 패턴이 많은 데이터는 잘 압축돼요.
또 다른 오해는 "스왑을 아예 꺼버리면 더 빠르다"는 거예요. 이건 상황에 따라 다른데, 스왑을 완전히 끄면 메모리가 부족할 때 OOM Killer가 프로세스를 강제 종료시켜요. 차라리 Zram이라도 설정해두는 게 안정성 면에서 나을 수 있어요.
한국 개발자에게 주는 시사점
클라우드 서버를 운영하는 분들이라면 Zswap 설정을 한 번 확인해볼 만해요. AWS EC2나 GCP 인스턴스에서 메모리가 빡빡할 때, Zswap을 켜는 것만으로 스왑 성능이 개선될 수 있거든요. 특히 메모리 좀 아끼려고 인스턴스 스펙을 낮추고 스왑에 의존하는 경우에 효과가 있어요.
도커 컨테이너나 쿠버네티스 환경에서는 호스트 레벨에서 설정하는 거라 좀 다르긴 한데, 노드의 메모리 효율을 높이는 데 도움이 될 수 있어요.
데스크톱 리눅스를 쓰는 개발자라면, 최근 배포판을 쓰고 있으면 이미 Zram이 켜져 있을 가능성이 높아요. swapon --show나 zramctl 명령어로 현재 상태를 확인해볼 수 있어요.
정리
Zswap은 디스크 스왑 앞의 압축 캐시, Zram은 RAM 안의 압축 스왑 디바이스. 비슷해 보이지만 용도와 동작 방식이 다르니 상황에 맞게 선택하세요.
여러분은 서버에서 스왑 관련 설정을 따로 튜닝하시나요? 아니면 기본값 그대로 쓰시나요?
🔗 출처: Hacker News
TTJ 코딩클래스 정규반
월급 외 수입,
코딩으로 만들 수 있습니다
17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공