본문 바로가기

전체보기/Network

[tomcat] catalina.out 관련 디스크 사용량 문제 해결

이번 글에서는 catalina.out과 관련하여

겪었던 문제와 이를 해결했던 과정에 대해 정리해보려고 합니다.

 

Unix 기반의 OS에서는 tomcat의 console output은 

catalina.out으로 redirect되어 있습니다.

 

때문에 시간이 지나면 catalina.out의 사이즈가 커지게 되고 

서버의 디스크 정리를 위해 해당 파일을 삭제하였습니다.

 

문제는 위 파일을 삭제했는데도 불구하고, 디스크 사용량이 줄어들지 않았다는 것입니다.

저희 회사에서는 디스크 사용량에 따라 알람을 전송하기 때문에

계속적으로 알람이 발생하고 있었습니다.

 

위 문제가 발생한 원인을 설명하기 앞서,

먼저 Unix계열에서 파일을 관리하는 방법에 대해 간략하게 알아보겠습니다.

Unix계열의 File system

Unix 계열에서 파일을 열면 file descriptor 값(양의 정수)을 인덱스로 갖게 됩니다.

 

각 프로세스는 해당 값을 통해 위 그림과 같이 파일에 접근하게 됩니다.

 

그림 마지막에 있는 inode는 파일의 메타정보를 가지고 있는 자료구조입니다.

각 파일은 하나의 inode를 가지고 있으며 

해당 값에는 파일의 소유자 그룹, 파일의 크기 등을 포함하고 있습니다.

 

다음의 명령어를 통해 현재 프로세스가 접근하고 있는 파일에 대한 메타정보를 알 수 있습니다.

 

ps -ef | grep [프로세스 이름]

cd /proc/[위에서 참조한 PID]/fd

ls -al

 

위 명령어의 결과는 다음과 같습니다.

 

total 0
dr-x------ 2 root root  0 Dec 15 20:37 .
dr-xr-xr-x 9 root root  0 Dec 15 20:37 ..
lrwx------ 1 root root 64 Dec 15 20:38 0 -> /dev/pts/0
lrwx------ 1 root root 64 Dec 15 20:38 1 -> /dev/pts/0
lrwx------ 1 root root 64 Dec 15 20:37 2 -> /dev/pts/0
lrwx------ 1 root root 64 Dec 15 20:38 3 -> /root/.test.txt.swp

 

위 결과는 file descriptor 값 -> 접근하는 파일의 메타정보를 의미합니다.

 

그런데 여기서 하나의 가정을 해보겠습니다.

 

A라는 프로세스가 .test.txt.swp 파일에 접근한 상태에서

B라는 프로세스가 해당 파일을 삭제한다면,

위 결과는 어떻게 달라질까요?

 

결과는 다음과 같습니다.

 

total 0
dr-x------ 2 root root  0 Dec 15 20:37 .
dr-xr-xr-x 9 root root  0 Dec 15 20:37 ..
lrwx------ 1 root root 64 Dec 15 20:38 0 -> /dev/pts/0
lrwx------ 1 root root 64 Dec 15 20:38 1 -> /dev/pts/0
lrwx------ 1 root root 64 Dec 15 20:37 2 -> /dev/pts/0
lrwx------ 1 root root 64 Dec 15 20:38 3 -> /root/.test.txt.swp (deleted)

 

실제 파일은 삭제 되었지만 파일의 메타정보는 삭제되지 않았습니다.

해당 파일 정보까지 삭제하기 위해서는 

접근하고 있는 프로세스를 종료시켜야 합니다.

du와 df의 차이

du와 df는 디스크 사용량을 조회하는 명령어 입니다.

 

잠깐 다시 문제로 돌아와서,

처음 catalina.out이 많은 용량을 차지하는 것을 확인하고

해당 파일을 삭제한 이후 이상한 점을 발견하였습니다.

 

바로, df와 du 명령어로 조회했을 때

각각의 결과값이 달랐던 것입니다.

 

어째서 이런 차이가 발생했던 걸까요?

 

그 이유는 df는 disk allocation map을 통해 파일 시스템의 메타정보를 포함한 정보를 조회하지만

du의 경우 사용자 레벨의 프로그램으로 파일의 메타정보는 조회하지 못하기 때문입니다.

 

위 예시에서 처럼 catalina.out을 삭제하더라도

tomcat에서 catalina.out에 접근하고 있기 때문에 메타정보는 삭제되지 않고

이 때문에 디스크 사용량은 줄지 않았던 것입니다.

 

결국 이를 해결하기 위해 tomcat을 재시작하였고

디스크 사용률은 정상으로 돌아왔습니다.

catalina.out 정리 방법

그렇다면 catalina.out을 삭제할 때마다

tomcat 프로세스를 종료시켜야 할까요?

 

다행히 다음 명령어를 통해 프로세스를 종료시키지 않고도

파일의 내용을 삭제할 수 있습니다.

 

> catalina.out

# [내용] > [파일]
# 파일에 내용을 덮어씌운다

 

> 명령어는 파일에 특정 데이터를 덮어 씌우는 명령어지만

빈값을 전달함으로써 파일의 내용을 모두 삭제할 수 있습니다.

 

즉, 정확히는 파일이 삭제되는 것이 아니라,

빈값으로 덮어씌워지는 것이기 때문에 우리가 겪은 문제는 발생하지 않게됩니다. 

( cat dev/null/ > catalina.out 역시 같은 원리도 동작합니다. )

 

위 방법은 간단하지만 모든 내용을 삭제하기 때문에

필요한 정보까지 삭제할 수 있습니다.

 

때문에 위 방법은 지양하고 해당 문제가 발생하지 않도록

파일들에 대한 정책을 세워두시길 바랍니다.

 

그럼 여기까지 제가 경험한 문제와 원인 그리고 해결 방법에 대해 정리해 봤습니다.

Reference

반응형

'전체보기 > Network' 카테고리의 다른 글

[Network] HTTS 통신 과정 파헤치기(1) - TLS/SSL  (0) 2021.04.13