티스토리 뷰

 

 

자바(JAVA)를 배운다면 지금 이글을 읽는 사람은 백엔드 개발자 일 것이다.

멀티 쓰레드는 기본 중에 기본으로 알아둬야한다. 하지만 처음 배운다면 되게 어려운 개념이라서 공부하기가 쉽지 않을 것이다.

남에게 알려준다면 항상 이렇게 알려준다고 생각하고 알기 쉽게 작성하게 되었다.

 

 

 

 

쓰레드 (Thread)

 

Thread란? 프로그램의 실행 단위로, 컴퓨터의 중앙 처리 장치(CPU)에서 실행되는 작업을 나타냅니다.

개발자의 관점에서 본다면, 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이 쓰레드가 됩니다.

쓰레드는 한번에 하나의 코드라인만 수행하며 이 쓰레드가 없다면 자바 애플리케이션 실행은 불가능 해집니다.

 

그럼 하나의 단일 쓰레드로 구성되어 있으면 싱글 쓰레드(Single Thread)

2개 이상처럼 여러 개의 쓰레드로 구성되어 있으면 이글의 주제인 멀티 쓰레드(Multi Thread)라고 부릅니다.

 

 

쓰레드 사용될 때 시각화

스레드 시각화

 

 

 

 

싱글 쓰레드

 

싱글 쓰레드는 한 프로세스(요청)에 하나의 쓰레드를 할당하여 실행하는 것이다.

싱글 쓰레드의 특징을 본다면 

요청1을 보냈는데 쓰레드가 하나있어서 처리중이라고 되어 있을 때, 

하지만 처리가 늦어지는 와중에 요청2가 들어오면 WAS에는 붙었지만 쓰레드를 받지 못해 대기중이 발생한다.

 

 

 

싱글 쓰레드 장점

  1. 문맥 교환(context switch) 작업을 요구하지 않는다.
  2. 프로그래밍이 쉽다.
  3. 멀티 쓰레드 보다 적은 리소스를 사용한다.

Tip) 문맥교환 (context  switch)  이란?

: 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기위해 이전의 프로세스의 상태를 보관하고, 새로운 프로세스의 상태를 적재하는 작업이다.

 

 

싱글 쓰레드 단점

  1. 하나의 작업만 처리하기 때문에 다중 프로세서에서 성능 발휘를 못한다.
  2. 여러 개의 CPU를 활용하지 못한다.
  3. 연산량이 많은 작업을 하는 경우, 그 작업이 완료되어야 다른 작업을 수행할 수 있다.
  4. 에러 처리를 못하는 경우 서버가 종료된다. (멈춘다)

 

 

 

 

싱글 쓰레드를 확장 한 멀티 쓰레드

 

싱글 쓰레드에서 확장한 개념인 멀티 쓰레드 시각화 이미지이다.

요청이 올 때 마다 쓰레드에 할당하여서 해당 요청을 계속해서 처리해 나간다.

 

 

왜?? 라는 질문을 던져 볼 것입니다.

 

 

 

 

 

요청이 올 때마다 쓰레드는 계속 생성??

 

바로 위에서 멀티쓰레드는 여러 개의 요청이 온다면 쓰레드를 할당하여 요청을 처리한다고 하였습니다.

그럼 레드를 할당하려고 할 때 쓰레드는 요청이 올 때마다 생성되는 건가??

 

결과적으로 설정하냐 안하냐에 따라 맞을 수도 있고 틀릴 수도 있습니다.

 

어.떠.한 설정을 안했을 때는 요청이 올 때마다 쓰레드가 계속 생성이 되기 때문에 이것에 대한 장단점을 알아보고 

이에 단점보완으로 나온 설정을 했을 때의 장단점을 알아보겠습니다.

 

 

 

 

요청마다 쓰레드 생성

 

요청 올때마다 생성해주고 쓰레드를 없애주면 편하지 않을까? 라고 생각하게 된다.

근데 요청마다 쓰레드를 생성하고 Task에 할당하면 안되는 이유를 장단점에서 단점만 봐도 알아 볼 것이다.

 

장점

  1. 동시 요청을 처리할 수 있다.
  2. 리소스(CPU, 메모리)가 허용할 때 까지 처리가능하다.
  3. 멀티쓰레드 이기 때문에 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 작동한다.

 

단점

  1. 쓰레드 생성 비용이 너무 비싸다.
    즉, 고객의 요청이 올 때마다 생성하면 응답 속도가 늦어진다.
  2. 쓰레드는 문맥 교환 (context switch) 비용이 발생한다.
  3. 쓰레드 생성에 제한이 없다.
    즉, 고객 요청이 너무 많으면 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다. (오버헤드 발생!)

 

만약 서비스가 너무 잘되어서 사람들이 많이 온다면 쓰레드를 계속 생성하게 될 것이고 이건 오버헤드가 발생하여 문제가 크게 나겠구나라고 생각이 될 것입니다.   그렇다면 이것에 대한 보완책이 있을까!?

 

 

 

 

요청 마다 쓰레드 생성의 단점 보완!  쓰레드 풀!

 

Tip) 쓰레드 풀이란, 쓰레드를 미리 생성하고, 작업 요청이 발생할 때 마다 미리 생성된 쓰레드로 해당 작업을 처리하는 방식을 의미한다.

 

 

쓰레드 풀을 사용하는 이유는 필요한 쓰레드를 쓰레드 풀에 보관하고 관리고 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리합니다.

WAS 인 톰캣은 최대 200개 기본 설정을 가지고 있고 변경이 가능합니다.

 

 

쓰레드 풀 생성하여 사용 할 때

스레드 풀 사용

쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용합니다.

사용을 종료 하면 쓰레드 풀에 해당 쓰레드를 반납합니다

 

 

쓰레드 풀에 쓰레드가 있지 않을 때

최대 쓰레드가 모두 사용중이면 쓰레드 풀에 쓰레드가 없기 때문에

요청을 특정 숫자 만큼 대기하도록 설정하고 요청을 거절할 수 있습니다.

 

 

 

장점

쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠릅니다.

생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있습니다.

 

 

 

쓰레드 풀 NginX 설정

events {
    worker_connections 1024;  # 각 워커 프로세스(worker process)가 동시에 처리할 수 있는 연결 수
    use threads;  # 레드 풀 사용을 활성화

    # 쓰레드 풀 설정
    threads 300;  # 사용할 쓰레드 수를 300으로 설정

    # 나머지 이벤트 설정
    # ...
}

 

 

 

 

감사합니다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함