h57studio / 03 /

Thirty backups in RAM

서버 메모리를 채운 배포 백업 30개

디스크는 5.5GB가 남아 있었는데 배포가 "No space left on device"로 멈췄음. 백업을 쌓던 /tmp가 디스크가 아니라 메모리였음.

배포할 때마다 백업 하나

이 홈페이지는 배포 스크립트 하나로 올림. 올리기 전에 서버의 현재 상태를 통째로 묶어 /tmp/h57studio-www-<시각>.tgz로 남겨 둠. 잘못 올렸을 때 그 파일 하나로 되돌리려는 것.

그날은 디자인을 여러 번 고쳐 올렸음. 한 번 올릴 때마다 30MB 남짓한 백업이 하나씩 쌓였고, 지우는 코드는 없었음.

디스크는 남았는데 공간 부족

평소처럼 배포를 돌렸는데 이렇게 멈췄음.

gzip: stdout: No space left on device
tar: /tmp/h57studio-www-20260925-1649.tgz: Cannot write: Broken pipe

디스크를 확인해 보니 이상했음.

Filesystem   Size  Used Avail Use% Mounted on
/dev/root     19G   13G  5.5G  70% /
tmpfs        455M  455M     0 100% /tmp

디스크는 5.5GB가 남아 있었음. 가득 찬 건 /tmp였고, 이 서버의 /tmp는 디스크가 아니라 tmpfs, 즉 메모리 위에 만든 공간이었음. 크기는 455MB. 거기에 백업 30개가 쌓여 있었음.

더 신경 쓰인 건 메모리 쪽임. 서버 메모리는 다 합쳐 900MB 남짓이고, 같은 서버에서 대화 앱, 아카이브, 웹게임 두 개가 돌아감. 배포 백업이 그 메모리의 절반을 차지하고 있었음. 이번엔 배포가 먼저 멈춰서 알았지만, 다른 서비스가 먼저 느려졌을 수도 있었음.

그나마 스크립트가 백업부터 만들고 나서 올리는 순서라, 백업에서 멈춘 배포는 서버를 전혀 건드리지 않았음. 반쯤 올라간 사이트는 없었음.

고친 것

  • 가장 최근의 온전한 백업 하나만 남기고 나머지를 지웠음. /tmp 사용량이 100%에서 5%로 내려감.
  • 백업 위치를 디스크(홈 폴더 아래)로 옮겼음.
  • 백업을 만든 뒤 최근 5개만 남기고 지우게 함. 한 줄이면 됨.
ls -1t $BK/*.tgz | tail -n +6 | xargs -r rm -f

/tmp가 디스크인지 메모리인지는 서버마다 다름. 지우는 코드 없이 쌓기만 하니 한 달도 안 돼서 이렇게 됐음.

같은 날 걸린 것 하나 더

배포 스크립트는 올리기 전에 서버와 "마지막으로 올린 버전"을 비교함. 서버에서 누가 직접 고친 게 있으면 덮어쓰지 않고 멈추려는 것. 그런데 이 비교가 엉뚱하게 걸렸음.

Only in 서버: site.js

저장소에서 지운 파일이 서버에는 남아 있었음. 올리는 방식이 tar로 파일을 덮어쓰는 거라 새 파일과 바뀐 파일은 들어가도 지운 파일은 서버에서 안 지워짐. 그래서 이제는 지난 배포와 지금 사이에 저장소에서 지워진 파일 목록을 뽑아 서버에서도 지움.

git diff --name-only --diff-filter=D deployed HEAD -- www