안녕하세요. 회사 내에서 서비스를 운영하기 위해 많은 서버들이 사용되고 있는데요.
그 중에 37GB정도의 용량을 가진 Java 서버의 메모리가 80%넘게 찼다는 봇 알림을 받게 되었어요.
제일 처음 했던 것은 가장 많은 용량을 차지하는 디렉토리를 알아보기 위해 각 디렉토리마다 들어가 아래와 같은 'df' 명령어를 사용하였어요.
du -ah | sort -n -r | head -n 10
위의 코드를 사용하면 해당 디렉토리 안에 용량을 가장 많이 차지하는 것 Top10을 뽑아줘서 굉장히 유용했어요.
그 결과 가장 많이 나온 디렉토리는 jar파일들을 저장하고 있는 디렉토리와 log를 쌓고 있는 디렉토리였어요.
로그 파일 정리하기
먼저는 로그를 쌓고 있는 디렉토리에 가서 오래된 log파일들을 정리했고, 그 결과 61%까지 떨어지는 것을 확인하였어요.
...
<maxFileSize>100MB</maxFileSize>
<maxHistory>10</maxHistory>
<totalSizeCap>2GB</totalSizeCap>
...
물론, 위와 같이 각 log파일마다 logback을 사용하여 관리를 하고 있었기 때문에 몇 년, 몇 달, 몇 주가 지난 정도의 과거 파일은 아니였고, 최근 테스트 때문에 더 많은 로그파일들이 생성되었기 때문에 maxHistroy기간보다 안된 과거 파일들을 정리해주었어요.
로그파일 관리하기
로그 파일 삭제 이후 로그 파일들을 조금 더 효율적으로 관리하여 저장용량을 절약하는 방법은 없을까? 찾던 도중 4가지의 방법을 찾게 되었죠.
- 로그 파일 압축 및 삭제 정책 구현 로그 파일이 많아지면서 저장 용량이 부족해지는 경우, 일정 기간 이전의 로그 파일을 삭제하거나 압축하여 저장 용량을 절약하기.
- 파일 크기 줄이기
<maxFileSize>100MB</maxFileSize> 각 파일의 최대 크기를 더 작은 크기로 변경하여, 한 파일당 저장되는 로그 양을 줄기 예를 들어, 50MB로 변경하면 파일당 로그를 반으로 줄일 수 있음. - 보존 기간 줄이기
<maxHistory>10</maxHistory> 로그 파일을 유지하는 기간을 더 짧게 설정하여, 디스크 공간을 더 효율적으로 사용할 수 있음. 예를 들어, 5일로 변경하면 60일보다 적은 기간 동안 유지됨. - 총 크기 제한 줄이기
<totalSizeCap>2GB</totalSizeCap> 로그 파일의 총 크기를 더 작은 크기로 설정하여, 디스크 공간을 더 효율적으로 사용할 수 있음. 예를 들어, 1GB로 변경하면 최대 10개의 파일이 저장될 수 있음.
하지만 로그 파일 크기를 무작정 줄이거나 maxFileSize를 너무 적게 설정하면 로그 파일이 자주 생성되어 디스크 공간을 더 많이 차지하게 될 수 있고, 이는 서버의 디스크 용량 부족으로 인한 서버 다운과 같은 치명적인 문제를 발생시킬 수 있었고, 테스트 과정에서
빈번하게 발생된 로그로 인해 많이 생긴 것이기 때문에 로그 파일의 크기나 maxFileSize를 줄이는 방향보다 파일 저장 기간을 10일에서 7일로 변경하는 방안으로 하였습니다.
JAR 디렉토리 정리하기
그 후 JAR파일을 저장하고 있는 디렉토리를 정리하였는데요. 앞 전에 말씀드렸던 log디렉토리는 1GB 미만이였는데
이 디렉토리 혼자 15GB를 차지하고 있었어요. 서버 배포 시 크리티컬한 오류가 생겼을 때 다시 원복하기 위해 쌓아놓고 있는 디렉토리인데요.
우선 이 서버를 구성하신 분께 디렉토리 안에 있는 JAR파일들을 정리해도 되는지 물었고, 과거 파일들은 삭제되도 상관 없다는 말을 듣고, 과거 JAR파일들을 삭제하였어요.
그랬더니 60%대 사용 용량이 30%대로 확 줄었지요.
JAR 디렉토리 파일 관리하기
마찬가지로 해당 디렉토리도 젠킨스 빌드 후 생성되는 JAR파일들을 관리해주어야 할 필요가 있었어요.
그러다 생각한 것이 1주 지난 파일들을 주기적으로 삭제하는 쉘 스크립트를 만드는 것이 였어요.
# 7일 이전의 날짜를 계산하여 변수에 저장
days_ago=$(date -d "7 days ago" +%Y%m%d)
# 해당 날짜 이전에 생성된 bp-*.jar 파일을 삭제
find /home/A/B/jar -maxdepth 1 -name "servername-$days_ago*.jar" -exec rm {} \;
그래서 위와 같은 쉘 스크립트를 만들었어요. find 옆 부분은 삭제할 파일들이 존재하는 디렉토리,
-name 부분에는 .jar파일의 name 포맷 같은 게 있었는데 그것에 맞추어 한 것이기 때문에 혹여나 위 코드를 사용하실 분들은 참고하시라고 써 보았습니다.
그 후 작성한 쉘스크립트를 크론탭을 사용하여 주기적으로 사용하도록 설정하였고, 프로세스들을 재부팅하여 수정된 부분들을 적용시켜 주었습니다.
'프로그래밍(Web) > 업무관련' 카테고리의 다른 글
Eclipse Memory Analyzer를 사용하여 메모리 누수 파악하기. (0) | 2023.06.15 |
---|---|
[바미] Java - BigDecimal 반올림 메소드 주의사항. (0) | 2023.05.06 |
[바미] ON DUPLICATE KEY UPDATE문을 주의해서 사용하자. (0) | 2023.02.03 |
[바미] Java Milliseconds to Seconds 에피소드. (0) | 2022.12.16 |
[바미] Java 스케줄러 삽질기. (0) | 2022.12.15 |