Profile picture

[Linux] Ubuntu 캐쉬 메모리 주기적으로 정리하기

JaehyoJJAng2023년 07월 22일

◾️ 개요

도커를 사용하여 조그마한 게임 서버를 하나 운영 중이다.

게임 서버의 경우 웬만한 웹 서버나 DB 서버보다 자원을 많이 소모하므로 주기적인 모니터링과 튜닝이 필요하다.


◾️ CPU 사용량

게임 서버의 경우 일반적으로 사람이 활동하는 시간과 겹치는 경향이 꽤 있다.

또한, 금요일 저녁부터 일요일 사이에 접속자가 늘어날 수 있으므로 CPU 상태를 주기적으로 체크해주어야 한다.
image

💊 해결 방법: 서버에 코어 추가 할당 또는 부하량 낮추기


◾️ 메모리 사용량

서버 운영에 있어서 CPU 만큼이나 중요한 것이 바로 메모리이다.

메모리가 부족하면 새로운 프로세스가 생성이 안되는 문제가 발생하기도 하고, 작은 여유 공간에 데이터를 넣었다, 뺏다가 하는 작업들을 해야하기 때문에 CPU 또한 과부하가 걸려 문제가 발생할 수 있다.

나의 경우 그에 대한 해결책으로 서버 메모리가 70%가 넘어갈 경우 자동으로 재부팅되도록 설정하였지만

메모리 순 사용량이 증가하는 현상은 막을 수 없었다.

유저 데이터 백업을 위하여 tar 압축 명령어를 사용하여 데이터를 백업 시키는 스크립트가 하나 있는데

해당 스크립트가 실행될 때마다 캐쉬 메모리가 대폭 증가하는 것을 확인할 수 있었다.

아무래도 tar 명령어를 사용하여 유저 데이터를 백업하는 과정에서 Disk I/O가 과도하게 일어나서 그런 것 같은데 ..

프로그램을 끄면 USER 메모리의 경우 해제가 되지만 캐쉬 메모리는 자동으로 해제가 되지 않는다.

그래서 캐쉬 메모리가 계속하여 증가하게 된다.

이 공간을 주기적으로 초기화하여 메모리를 확보해보려 한다.
image


▪️ 캐쉬 메모리 삭제

$ sync && echo 3 > /proc/sys/vm/drop_caches

image
캐쉬메모리가 비워지고 전체적인 메모리 사용량이 줄어든 것을 확인할 수 있다.


▪️ 주의 사항

캐쉬메모리는 속도가 다른 장치간의 속도 개선을 위해 사용된다. (Disk I/O ..)

디스크 I/O가 활발히 일어나는 시스템에서 drop_caches를 사용하면, 일시적으로 CPU 부하가 크게 증가한다.
(서버가 다운될 정도로 증가하지는 않음.)

이런 경우 drop_caches를 아예 사용하지 않거나, 트래픽이 적은 시간대에 사용하는 것을 권장한다.


drop_caches 는 non destructive operation 이기 때문에 자주써도 데이터 손실이 발생하지 않는다.

캐쉬 메모리 중 write buffer라는 파일 쓰기 대기 버퍼(=dirty cache)가 있는데, 이러한 것들은 drop_caches로 사라지지 않는다.

sync 명령어는 이러한 write buffer 내용을 디스크에 쓰고 drop 할 수 있는 cache로 변환한다.

즉, sync 후에 drop_cache를 하면 최대한 많은 메모리를 확보할 수 있는 것이다.

$ sync && echo 3 > /proc/sys/vm/drop_caches

Loading script...