crossorigin="anonymous">
외과전담간호사의 조용한 복습시간

리눅스

리눅스 파일/디스크 용량 관리 – du, df, ncdu, lsof 실전 정리

bluefrog 2025. 4. 20. 07:47
반응형

처음엔 몰랐다. 리눅스 서버에서 디스크 용량이란 게 얼마나 빨리, 얼마나 조용히 차버릴 수 있는 건지. 그냥 웹 서버 띄우고 로그 좀 쌓이고 이미지 몇 개 저장되면 한참 남았겠거니 했는데, 어느 날 갑자기 이상하게 서비스가 느려지고, 파일 저장이 안 되더니 서버에서 “no space left on device” 에러가 뜨는 거다. 나는 처음엔 디스크 용량 부족인 줄도 모르고 이것저것 재시작만 하다가 완전 멘붕... 그 이후로 진짜 철저하게 용량 체크하는 습관이 생겼고, 그때부터 du, df, ncdu, lsof 같은 툴을 자주 쓰기 시작했다.

일단 디스크 상태 확인은 df부터 시작한다. df -h는 가장 기본 중의 기본인데, 각 마운트 포인트별 사용량이 사람 읽기 편한 단위(GB/MB)로 정리돼서 나온다. 루트(/)가 100% 가까이 되면 거의 모든 파일 쓰기 동작이 멈추니까, 가끔씩 df -h로 점검해보는 게 진짜 중요하다. 특히 /var, /home, /tmp 같은 데가 갑자기 꽉 차는 경우가 많다. 로그, 캐시, 임시 파일들이 대부분 여기 몰리거든.

근데 df는 어느 파티션이 얼마나 찼는지는 보여주지만 어디서 많이 쓰고 있는지는 안 알려준다. 그럴 때 쓰는 게 du다. du -sh *를 현재 디렉토리에서 실행하면 각 폴더별로 얼마나 용량을 차지하고 있는지 딱 보여준다. 나는 보통 루트에서 /var가 수상하면 cd /var 한 다음에 du -sh * 찍어본다. 그러면 log, lib, cache 중 뭐가 문제인지 바로 보인다. 진짜 많이 쓰는 조합이 du -sh ./* | sort -hr | head -10 이런 거다. 상위 10개 폴더가 어떤 괴물같이 용량 먹고 있는지 바로 파악 가능하다.

근데 du는 느리다. 폴더 크기 계산하려면 디스크 다 읽어야 해서 수십만 개 파일 있는 디렉토리에서 돌리면 진짜 오래 걸린다. 그래서 요즘은 ncdu를 더 자주 쓴다. ncdu는 du에 curses UI를 입힌 느낌인데, 속도도 빠르고, 상호작용도 가능해서 딱 내 스타일이다. 설치는 apt install ncdu 한 줄이면 끝나고, 실행은 ncdu / 이런 식으로 루트부터 시작하면 된다. 들어가면서 폴더별로 얼마나 차지하는지 보기 편하게 나오고, 키보드 방향키로 왔다 갔다 하면서 삭제까지 가능하다. 특히 디스크 압박이 급박할 때 ncdu만큼 빠르게 원인 파악 가능한 도구도 없다.

그리고 이건 진짜 중요한데, 디스크가 분명 비어 있는데도 df로 보면 공간이 안 줄어드는 경우가 있다. 이럴 땐 거의 100% 열린 파일 핸들 문제다. 어떤 프로세스가 파일을 열어놓은 채로 그 파일이 삭제되면, 겉보기엔 없어진 것처럼 보이지만 실제로는 디스크를 계속 점유하고 있는 거다. 이걸 찾는 데는 lsof가 제격이다. lsof | grep deleted 하면 그런 '삭제됐지만 살아있는' 파일들이 다 나온다.

예전에 내가 한번 로그 파일 수동으로 삭제했는데도 디스크가 전혀 줄지를 않아서 이상하다고 생각했다. 알고 보니 nginx 로그 파일을 열어놓은 상태로 계속 쓰고 있던 거였다. lsof로 보니까 /var/log/nginx/access.log (deleted) 이런 게 걸려 있어서 nginx 리로드하고 나서야 제대로 공간이 확보됐다. 그 이후로는 로그 삭제할 땐 항상 service나 systemctl reload 같이 해당 프로세스를 같이 다뤄준다.

추가로, 이런 디스크 상황을 감지하는 스크립트를 짜서 crontab에 등록해두면 진짜 편하다. 나도 df -h | grep '/$' 해서 루트 디렉토리 사용량을 체크하고, 90% 넘으면 슬랙이나 이메일로 알림 주는 식으로 세팅해뒀다. 진짜 큰 사고는 대부분 “모르고 있다가” 터지니까, 미리미리 감지하는 게 진짜 핵심이다.

요약하자면, 디스크 용량 관리는 리눅스 서버 운영에서 기본 중의 기본이다.

  • df -h로 전체 상황 체크
  • du -sh, ncdu로 폴더별 사용량 추적
  • lsof | grep deleted로 숨은 디스크 점유 추적

이 세 가지만 익혀두면 디스크 부족 문제로 서버가 죽는 일은 거의 없을 거다. 내가 해보니까, 진짜 리소스 부족보다 더 무서운 건 ‘내가 지금 왜 부족한지도 모르는 상태’더라. 그걸 해결해주는 게 바로 이런 명령어들이고. 가볍게라도 실습 한번 해보면 감이 잡힌다. 진짜 오늘 저녁에라도 ncdu 한 번 돌려보면 내 서버에서 누구가 몰래 공간 잡아먹고 있는지 바로 알 수 있을 거다. 강력 추천.

반응형