스레드(Thread)란? 고갈 원인, 결과, 방지

애플리케이션은 스레드를 통해 작업을 처리합니다. 스레드가 고갈되면 작업을 정상적으로 처리하지 못하게 됩니다. 쉽게 말해 서비스되고 있는 애플리케이션에 장애가 발생합니다. 스레드가 무엇인지, 스레드가 고갈되는 이유는 무엇인지와 그에 따른 결과, 스레드 고갈을 방지하는 방법에 대해 알아보겠습니다.

스레드란?

스레드(Thread)는 프로세스 내의 별도 실행 흐름을 의미합니다. 프로세스 안에 작은 프로세스라고 이해해도 될 거 같습니다. 예를 들어, 톰캣이 구동하는 서비스가 있다면, 톰캣은 스레드 풀(Pool)을 만들고 스레드를 통해 클라이언트의 요청에 응답할 수 있습니다. 스레드는 병렬 처리를 지원하기 때문에 여러 요청이 한 번에 와도 여러 스레드가 동시에 요청을 처리합니다. 성능 향상을 돕습니다.

스레드
하나의 프로세스에 (왼쪽) 스레드가 하나 (오른쪽) 스레드가 세 개. 스레드가 세 개면 3개 작업을 동시에 처리한다. 출처=https://www.tutorialspoint.com


멀티 스레드 개념은 톰캣 같은 웹서버 뿐만 아니라 GUI 응용 프로그램, 동영상 및 오디오 재생, 데이터베이스 쿼리 수행 등 다양하게 적용됩니다. 크롬에 여러 가지 탭을 동시에 띄워 사용할 수 있는 것도 멀티 스레드를 지원하기 때문이라고 할 수 있겠죠. 요점은 스레드를 구성해서 동시에 여러 요청을 처리할 수 있다는 것입니다.

스레드 고갈이란?

스레드가 고갈되는 경우도 있습니다. 애플리케이션에서 생성된 스레드 수가 시스템에서 사용 가능한 리소스를 초과하는 상태가 그렇습니다. 스레드 고갈이 발생하면 서버 성능이 저하되고 심하면 애플리케이션이 기능을 수행하지 못하게 됩니다.

스레드가 고갈된 경우 프로세스가 하는 몇 가지 대처가 있습니다. 응용 프로그램 특성에 따라 대처 방식은 조금씩 다릅니다.

  • 응답 거부 : 새로운 요청이 거부됩니다. 로그에는 관련 오류 메시지가 기록됩니다. 리소스가 부족한 상태에서 계속 요청을 처리하면 시스템 전체가 과부하 걸릴 수 있기 때문에 이를 방지하기 위한 조치입니다.
  • 큐에 추가(Queueing) : 스레드가 사용 가능해질 때 새로운 작업을 처리하도록 큐에 추가합니다.
  • 차단 : 스레드를 사용할 수 있을 때까지 새 작업 실행을 차단합니다.
  • 동적 할당 : 상황에 따라 스레드 풀의 크기를 동적으로 조정합니다. 예를 들어 스레드 고갈이 오면 풀을 자동으로 확장할 수 있습니다.

스레드 고갈이 발생하는 이유

스레드 고갈 원인을 정확히 파악하기 위해서는 문제가 발생하는 시점에 애플리케이션의 스레드 덤프 수집이 필요합니다. 단, 일반적으로 발생하는 이유를 몇 가지 들 수 있습니다.

  • 스레드 생성 속도 : 짧은 시간에 많은 수의 스레드가 생성되는 경우 시스템 리소스가 부족할 수 있습니다.
  • 스레드 누수 : 스레드가 생성되고 종료되지 않아 시간이 지나며 스레드가 불필요하게 축적되는 경우입니다.
  • 차단된 스레드 : 스레드가 차단되어 리소스 또는 I/O 작업을 기다리고 있으나 진행할 수 없는 경우 시스템 리소스를 소진합니다.
  • 시스템 리소스 고갈 : 시스템 리소스가 고갈된 경우 여러 스레드가 이를 위해 경쟁하기 때문에 일부 스레드는 동작하지 못할 수 있습니다. 이런 이유로 애플리케이션 사용자가 여럿인 경우 일부는 기능을 사용할 수 있는데, 일부는 사용할 수 없는 현상이 발생할 수도 있는 것이죠.

스레드 고갈 방지하는 방법

스레드 고갈을 방지하려면 애플리케이션의 스레드 사용량을 모니터링하고 관리해야 합니다. 관리를 통해 불필요한 스레드는 생성되지 않도록 하고, 스레드가 정상적으로 종료되는지 확인합니다. 근본적으로는 복잡도가 높지 않은 효율적인 알고리즘을 사용하는 게 필요합니다.

스레드 모니터링은 자바의 경우 JConsole이나 VisualVM 같은 툴을 많이 사용합니다. 가령 JConsole은 JDK에 포함되어 있는 도구입니다. 실시간 스레드 수, 각 스레드의 상태, 각 스레드의 CPU 사용량을 포함해 자바 애플리케이션의 스레드 사용량을 표시합니다.

반응형

댓글

Designed by JB FACTORY