NakedFlower 님의 블로그

[Infratice] 디스크 용량 100% 원인 프로세스 찾기 본문

Troubleshooting

[Infratice] 디스크 용량 100% 원인 프로세스 찾기

nakedflower 2026. 5. 11. 15:12

문제


내 답변


df -h를 명령어 입력해서 서버 디스크 상태를 확인했을 때 /dev/sda1 이 가득차있다. 현재 100%를 다 쓰고 있다...근데 sda1과 sda2의 차이는 뭘까...아무튼 그래서 du -sh /var/*를 명령어를 넣었다는데 일단 이 명령어가 정확히 뭔지 모르겠네...근데 아무튼 대략 /var/가 붙어 있는 파일들이 차지하고 있는 용량이 나오는 명령어라고 추측했을 때 문제상황에서 로그 파일이 45G나 차지하고 있기 때문에 아무래도 로그가 엄청 많이 쌓여서 그런듯함. 그런 정확히 어떤 로그가 쌓인 걸까..봤더니 app-debug.log가 42G나 쌓여 있고 app-error.log가 2.8G로 이 또한 낮지 않음. 그렇다면 app-debug.log를 지워줘야 하는데...이 로그를 단순히 rm으로 지우기 전에 몇일분량의 로그는 남겨두는게 좋을 것이다. 그럼 일단 3일 분량의 로그만 남겨둔다고 생각했을 때 명령어를 입력하는건데...힌트에서 lsof명령어를 활용하라네...lsof 명령어는 또 뭐지...아무튼 내가 이 상황이었으면 일단은 rm으로 지우고 당장의 문제를 해결하려고 했을 듯.

 


AI와 함께하는 공부

1. sda1과 sda2의 차이

파티션 마운트 위치 용도
sda1 / 운영체제 및 기본 시스템
sda2 /data 별도 데이터 저장

 

즉:

  • /var/log 는 / 아래 있으므로
  • /dev/sda1 용량을 사용합니다.

반면 /data는 여유가 많아도 /가 꽉 차면 소용없습니다.

 

2. rm으로 바로 지우면 안됨

rm app-debug.log

를 해도 디스크 사용량은 줄어들지 않을 수 있음

 

왜냐하면:

  • 프로세스가 파일을 열고 있는 상태라면
  • inode는 살아있고
  • 디스크 공간도 계속 점유됩니다.

이때 쓰는 게 바로 lsof입니다.

 

그럼  lsof가 정확히 무엇인가?

List Open Files의 약자로 “현재 프로세스가 열고 있는 파일”을 보여줍니다.

 

그래서 

lsof | grep deleted


이런 명령어를 입력했을 때

java  1234 root  5w REG  8,1 42G /var/log/app-debug.log (deleted)

 

이렇게 나오면 파일은 삭제됐지만 java 프로세스가 아직 붙잡고 있어서 디스크 공간이 반환이 안되고 있는 상태임을 알 수 있다.

 

 

그렇다면 어떻게 해야 적절한 절차대로 디스크 공간을 확보할 수 있을 것인가

 

Step 1. 가장 큰 파일 확인

du -ah /var/log | sort -rh | head

 

Step 2. 열린 파일인지 확인

lsof | grep deleted

 

Step 3. truncate를 이용

truncate -s 0 /var/log/app-debug.log

 

이 방식은:

  • 파일은 유지
  • inode 유지
  • 프로세스 restart 불필요
  • 공간 즉시 회수

라서 안전하다고 합니다.

 

아마 이렇게까지 하면 현 상태는 해결이 되겠지마 추후에 동일한 문제가 발생하는 것을 예방하기 위해서

logrotate 까지 설정을 하면 된다고 합니다.

cat > /etc/logrotate.d/app << 'EOF'
/var/log/app-*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}
EOF

된다고 합니다.