WARN : Thread starvation or clock leap detected ?

진행하고 있는 프로젝트(MoovDa)는 OPEN API를 이용해 영화 데이터를 DB에 저장해 사용한다. 실제 서비스처럼 무수히 많은 영화 데이터를 저장해 사용하면 좋겠지만, MoovDa는 현재 서비스를 테스트해 볼 정도의 데이터가 들어있다. 한 번에 200~300개의 영화를 추가하는데 추가할 때마다 ”Thread starvation or clock leap detected” 이런 메시지와 함께 서버가 멈춘다. 단순하게 생각하면 “과부하” 걸린 것 같다. 뭐가 문제일까?

Process

Thread에 대해 얘기하기 전에 먼저 Process를 이해할 필요가 있다.

프로세스의 사전적 의미는 **“컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램”**이다. 과거의 운영체제(MS-DOS 등)는 한 번에 여러 가지 작업을 할 수 없었다. 요즘 운영체제(윈도우, 리눅스, 유닉스 등)는 여러 가지 작업을 동시에 할 수 있다. 여러 개의 프로세스를 동시에 실행하는 것을 “멀티태스킹”이라고 하고, 어떤 작업을 하나 이상의 프로세스에서 병렬로 처리하는 것을 **“멀티 프로세싱”**이라고 한다.

Process.PNG

프로세스는 프로그램 실행 시 Code, Data, Stack, Heap의 구조로 되어있는 독립된 메모리 영역을 할당받는다. 이러한 특징은 멀티 프로세싱 방식에서 단점이 있는데, 멀티 프로세싱의 방식은 CPU에서 여러 프로세스를 로테이션으로 돌면서 처리한다. 동작 중인 프로세스의 상태를 저장하고 다음 순번의 프로세스가 동작하면서 이전에 저장했던 프로세스의 상태를 복구한다. 이 일련의 과정을 “Context Switching” 이라고 한다. Context Switching이 발생하게 되면 많은 Cost가 소요되고(Cache 초기화, Memory Mapping 초기화, Kernel은 항상 실행되어야 한다.), 오버헤드가 발생한다.

Thread

스레드의 사전적 의미는 “프로세스 내에서 실행되는 여러 흐름의 단위”이다. 프로세스는 최소 1개의 스레드를 가지고 있고 그것을 **“메인 스레드”**라고 한다. 프로세스가 2개 이상의 스레드를 가지고 있으면 **“멀티 스레드”**라고 한다.

thread.PNG

스레드는 프로세스 내에서 Stack만 할당받고 Code, Data, Heap 영역을 공유한다. Stack 영역만 처리하면 되므로 비용이 감소하게 된다. 하지만 여러 스레드가 동시에 작업하며 공유된 데이터를 사용하다가 충돌이 일어날 수 있고, 디버깅이 까다롭다.

⭐ 프로세스와 스레드는 서로 다른 용도와 특성을 가지고 있으며, 적절한 상황에 맞게 사용해야 한다. 프로세스는 독립성이 높고 안정적이지만, 생성과 종료에 많은 시간과 자원이 소요되고, IPC를 통한 통신에 비용이 발생한다. 반면에 스레드는 프로세스 내에서의 경량화된 실행 단위로 빠른 생성과 종료가 가능하며, 데이터 공유를 통해 효율적으로 작업을 처리할 수 있지만, 동기화와 교착상태 등의 문제에 주의해야 한다.

DB Connection Pool(HikariCP)