만든 프로젝트에 HTTPS를 적용하려고 ec2 서버에 배포를 시도하자 서버가 먹통이 되면서 아래와 같은 에러를 뱉어냈다.
com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=1m54s644ms55µs881ns).
검색을 해보니 Thread들이 기아 현상에 빠지는 상황은 보통 많은 스레드들이 동작하면서 자원을 경쟁하는 상황이라는 정보를 얻었다.
그렇지만 나는 단순히 서버를 띄우는 과정인데, 그렇게 많은 스레드가 동작할까 하는 의문을 가졌다. 그 과정에서 혹시 자원 자체가 부족해서 스레드들이 대기하고 있는 게 아닐까 하는 의문을 가졌다.
aws의 모니터링 탭에 들어가 확인을 해 본 결과 CPU의 사용량이 100%에 육박한 걸 확인할 수 있었다.
Thread들이 기아 현상에 빠지는 순간 CPU 사용량이 급증하는 걸 확인할 수 있었다.
메모리 상태를 확인하기 위해 서버에 들어가 확인해본 결과 kswapd0
이라는 프로세스가 많은 자원을 가져가고 있었다.
kswapd0
는 메모리가 부족해서 SWAP 메모리를 사용할때 생성되는 프로세스이다.
다시 로컬 컴퓨터로 돌아와 jar 파일을 실행하니 아래와 같은 실행시간을 확인할 수 있었다.
서버에서 메모리 사용량을 확인하자 MySQL이 40퍼센트 정도를 점유하고 있었다. MySQL이 대략 500, java가 대략 500 정도씩 가져가면 메모리가 부족하겠구나 하는 결론을 낼 수 있었다.
메모리를 줄이기 위해 서버에서 swap 메모리를 사용하는 방식도 있지만, 분리가 가능한 만큼 MySQL을 별도의 서버로 분리하기로 결정했다.
WAS와 DB를 분리하니까 문제없이 잘 동작하는 걸 확인할 수 있었다.
프리티어 서버는 크기가 작다. 웬만하면 서버를 다 분리해서 사용하자. 만약에 그래도 부족하면 Swap 메모리 설정을 해줍시다.