[ MySQL ] Thread

Manx·2023년 9월 17일
0

DBMS

목록 보기
4/8

MySQL에서는 각 요청을 어떻게 처리하는지 정리해 보고자 한다.
Real MySQL 8.0 책을 읽고 정리한 내용이다.

MySQL 스레딩 구조

  • 프로세스 기반이 아닌 스레드 기반으로 작동
  • Foreground / Background Thread로 구분

전통적인 스레드 모델에서는 Connection 별로 포그라운드 스레드가 하나씩 생성되고 할당된다.
Thread pool에서는 Connection과 포그라운드 스레드는 1:1관계까 아닌, 하나의 Thread가 여러 개의 Connection 요청을 전담한다.


Foreground Thread ( Client Thread )

  • MySQL 서버에 접속된 Client 수만큼 존재
  • 사용자가 요청하는 쿼리 문장 처리
  • Connection 종료 시 Thread cache로 되돌아감
  • Thread cache에 설정된 값이 있으면, 종료
  • 최대 Thread 수 : thread_cache_size

Background Thread

MyISAM

  • 디스크 작업까지 Foreground Thread가 처리

InnoDB

  • Insert Buffer를 병합
  • 로그를 디스크로 기록
  • 버퍼 풀의 데이터를 디스크에 기록
  • 데이터를 버퍼로 읽어 오는 역할
  • 잠금이나 데드락을 모니터링

Foreground Thread는 데이터 버퍼 or 캐시까지만 처리, 버퍼로부터 디스크까지 기록하는 작업은 Background Thread가 처리

중요 ! ( 후에 InnoDB 버퍼 풀에 해당 내용과 관련된 내용이 나온다. )

💡 MyISAM은 io작업도 포그라운드가 진행하기 때문에, bulk insert가 안된다.

InnoDB는 백그라운드가 진행하기 때문에 데이터 파일로 완전히 저장될 때 까지 기다리지 않아도 된다.


Thread cache

  • 커넥션을 종료하면, Thread cache로 돌아간다
    ( Thread cache size만큼 없을 경우 )
  • Thread cache에 설정 값만큼 있다면, Thread를 종료시킨다.

Threads_created / Connections 값이 1% 이상이면 thread_cache_size를 증가시켜야 한다고 한다.


Thread Pool

  • MySQL은 Thread Pool이 아닌 Connection 당 Thread로 처리한다.
    ( Thread Cache 사용 )
    => Enterprise 버전에서는 Thread Pool 제공

  • 내부적으로 사용자의 요청을 처리하는 스레드 개수를 줄여서 동시 처리되는 요청이 많다 하더라도 서버의 CPU가 제한된 개수의 스레드 처리에만 집중할 수 있게 하여 자원 소모를 줄이는 것이 목적

  • 기본적으로 CPU 코어의 개수만큼 스레드 그룹 생성

  • 스레드 풀이 처리 중인 작업이 있는 경우 thread_pool_oversubscribe 에 설정된 개수만큼 추가로 더 받아들여 작업

    • 값이 커지면, 스케줄링해야 할 스레드가 많아져 비효율적으로 작동
  • 모든 스레드가 일을 처리하고 있을 경우, 새로운 스레드를 추가할지, 완료를 기다릴지 판단

  • thread_pool_stall_limit 에 설정된 ms만큼 대기했다가, 스레드 추가

  • 전체 스레드 갯수는 thread_pool_max_threads 수를 넘을 수 없다.

  • 선순위 후순위 큐를 이용해 먼저 시작된 SQL을 빨리 처리해주면 lock을 빠르게 해제하고, 경합을 낮춰 성능 향상 가능.


Thread Pool , Thread Cache

그렇다면, 둘 간의 차이는 무엇일까?

  • Thread Pool에 저장되어 있는 Thread는 없어지지 않고, 계속 재사용 된다.
  • Thread Cache에 저장되어 있는 Thread는 언제든지 없어질 수 있고, 새로 생성될 수 있다. ( 갯수가 넘칠 경우 없앰 )

MySQL에서는 Query Cache도 삭제되었고, Thread Cache를 이용하므로 Connection 당 Thread가 생성된다고 볼 수 있다.
DB를 여러개 사용할 경우, Thread 수가 감당할 수 없게 만들어지고 똑같은 쿼리라도 각자 메모리를 먹는다.
그래서 ProxySQL을 사용한다.

profile
백엔드 개발자

0개의 댓글