TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 28 READS

FreeBSD가 내 RAM을 다 먹었다?! 사실은 OS가 일을 잘하고 있다는 신호예요

FreeBSD가 내 RAM을 다 먹었다?! 사실은 OS가 일을 잘하고 있다는 신호예요

서버에 SSH로 접속해서 top을 딱 열었는데 free 메모리가 거의 0으로 표시돼 있으면 심장이 덜컥하죠. “어디서 메모리 누수가 나는 거지?” 싶어서 프로세스를 하나하나 뒤지게 되고요. FreeBSD 서버를 쓰던 한 개발자도 똑같은 경험을 했는데요, 원인을 파고들어 보니 문제가 아니라 오히려 운영체제가 일을 아주 잘하고 있다는 신호였다는 이야기를 블로그에 정리했어요. 리눅스 진영에서 유명한 “Linux ate my RAM” 이야기의 FreeBSD 버전인 셈인데, OS가 메모리를 다루는 방식을 이해하기에 정말 좋은 소재라서 풀어볼게요.

“남는 RAM은 낭비되는 RAM”이라는 철학

현대 운영체제는 기본적으로 이런 생각을 갖고 있어요. RAM은 디스크보다 수백 배 빠른데, 비워두면 그 속도 이점을 하나도 못 쓰는 거잖아요? 그래서 프로그램이 당장 안 쓰는 메모리가 있으면 OS가 거기에 디스크에서 읽었던 파일 내용을 복사해둬요. 이걸 “디스크 캐시” 또는 “페이지 캐시”라고 부르는데요. 이게 뭐냐면, 도서관에서 자주 찾는 책을 매번 서가까지 가지 않으려고 책상 위에 쌓아두는 것과 같아요. 다음에 같은 파일을 읽을 때 디스크까지 안 가고 메모리에서 바로 꺼내니까 훨씬 빠르죠. 그리고 새 프로그램이 메모리를 달라고 하면 책상 위 책을 치우듯 캐시를 바로 비워서 내어줘요. 그러니까 “free가 0”은 위험 신호가 아니라, OS가 남는 공간을 알뜰하게 캐시로 활용하고 있다는 뜻이에요.

FreeBSD는 메모리를 이렇게 분류해요

FreeBSD의 top을 보면 메모리가 여러 항목으로 나뉘어 나와요. Active는 프로세스가 최근에 실제로 쓰고 있는 메모리, Inactive는 한동안 안 쓰여서 “필요하면 회수해도 되는” 후보 메모리예요. Laundry는 이름이 재밌는데, 내용이 변경된 상태라 회수하기 전에 디스크에 한 번 “세탁”(기록)을 거쳐야 하는 메모리를 말해요. Wired는 커널이 고정해둬서 스왑으로 내보낼 수 없는 메모리고, Free가 진짜 아무 일도 안 하고 노는 메모리죠. 그러니까 실제로 “쓸 수 있는 메모리”는 Free만이 아니라 Inactive와 캐시성 메모리까지 합쳐서 봐야 정확해요.

범인처럼 보였던 건 ZFS의 ARC였어요

FreeBSD에서 특히 헷갈리게 만드는 주인공이 ZFS의 ARC예요. ZFS는 FreeBSD가 기본으로 밀어주는 고급 파일시스템인데, ARC(Adaptive Replacement Cache)라는 아주 똑똑한 캐시를 갖고 있어요. 이게 뭐냐면, 단순히 “최근에 읽은 것”만 기억하는 게 아니라 “자주 읽는 것”과 “최근에 읽은 것”의 균형을 스스로 맞춰가며 캐시하는 알고리즘이에요. 문제는 이 ARC가 top에서 Wired 항목으로 집계된다는 거예요. Wired는 원래 “회수 못 하는 커널 메모리”라는 인상이 강하니까, ARC가 수십 GB를 차지하고 있으면 커널이 메모리를 삼켜버린 것처럼 무섭게 보이거든요. 하지만 실제로는 메모리가 부족해지면 ARC가 알아서 몸집을 줄이면서 공간을 내어줘요. 겉보기와 달리 아주 얌전한 캐시인 거죠.

그럼 진짜 문제는 언제일까요

정말 걱정해야 할 신호는 따로 있어요. 스왑 사용량이 계속 늘어나거나, 메모리를 디스크로 내보내는 page-out이 활발해지거나, 프로세스가 메모리 부족(OOM)으로 죽기 시작하면 그때가 진짜 메모리 부족이에요. 리눅스라면 free -h 명령에서 “available” 컬럼을 보는 게 정답이고요. 이 오해가 하도 흔해서 리눅스 쪽에는 linuxatemyram.com이라는 설명 사이트가 따로 있을 정도예요.

실무 관점에서 한 가지 더 챙길 게 있는데요, 모니터링 알람을 “free 메모리 기준”으로 잡아두면 멀쩡한 서버에서 밤새 오탐 알람이 울릴 수 있어요. 클라우드 VM 대시보드나 쿠버네티스 노드의 메모리 사용률 그래프도 캐시를 포함해서 90%처럼 보이는 경우가 많거든요. 알람 기준을 available이나 스왑·page-out 지표로 바꿔두면 새벽에 헛출동하는 일이 확 줄어요.

정리하면, “RAM이 꽉 찼다”는 건 대부분 OS가 캐시로 성능을 끌어올리고 있다는 좋은 신호예요. 여러분은 서버 메모리 알람 기준을 어떻게 잡고 계세요? free 수치만 보고 놀라서 서버를 재부팅해 본 경험이 있다면 댓글로 공유해 주세요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://crocidb.com/post/freebsd-ate-my-ram/
SHARE
처리 중...