MySQL Thread pool과 Percona Server

@lim · August 11, 2024

개요

스레드는 너무 많아지게 되면 컨텍스트 스위칭 비용이 커지가 되면서 성능이 저하된다.
멀티 스레드 프로그램은 스레드 풀(thread pool)을 이용하여 스레드 개수를 제한한다.

스레드 풀 예시
스레드 풀 예시
https://www.baeldung.com/thread-pool-java-and-guava

쓰레드 풀이란

서버는 요청이 들어오면 새 스레드를 생성하는 것이 아닌 스레드 풀에게 작업을 위임한다.

스레드 풀은 놀고있는(아이들 상태인) 스레드가 생기면 스레드에 할당하여 작업하도록 한다.

내부적으로 큐에 저장되며, 스레드 풀의 스레드들은 해당 큐에서 작업을 가져가 실행한다.
큐에 새로운 작업이 들어오면 놀고 있는 스레드가 큐에서 작업을 가져가 실행한다.
이 과정을 스레드에 작업이 할당되었다고 하며, 작업이 할당되지 않은 스레드들은 큐에 새로운 작업이 들어오기 전까지 대기 상태로 유지된다.

스레드 풀의 스레드 개수를 10개로 정했을 때 100개의 요청이 동시에 들어게 된다면 처음 10개의 요청은 스레드에 배정하고 나머지는 큐에 저장하여 대기한다.

(MySQL은 멀티 스레드 DBMS이다.
포그라운드 스레드와 백그라운드 스레드로 구분된다.)

MySQL의 스레드 처리

MySQL의 기본 스레드 처리 모델은 Client Connection 당 하나의 스레드를 사용하여 명령문을 실행한다.
이러한 방법은 많은 Client가 Server에 연결하여 요청할수록 전체 시스템 성능이 저하되는 문제가 발생한다.
이를 위해 Thread Pool을 사용하여 오버헤드를 줄이고 성능을 향상하도록 설계된 Thread 모델을 사용하는 것이 바람직하다.

MySQL Enterprise Edition과 MariaDB의 모든 Edition에서는 스레드 풀 기능이 제공되지만 MySQL Community Edition에서는 제공하고 있지 않다.
(MariaDB : MySQL 포크 DBMS)

MySQL Enterprise Edition에서는 MySQL 설정 파일(my.cnf)에서 아래와 같이 설정을 추가해주면 된다.

[mysqld]
thread_handling=pool-of-threads
thread_pool_size=4  # 사용 가능한 CPU 코어 수에 맞게 조정

만약 비활성화 하려면 아래와 같이 thread_handling 설정을 변경해준다.

[mysqld]
thread_handling=one-thread-per-connection

Percona Server

MySQL Community Edition에서는 스레드 풀 기능을 제공하고 있지 않지만, Percona사 에서 플러그인 형태로 제공하는 Percona Server for MySQL 을 이용하면 스레드 풀을 이용할 수 있다.

Percona사는 MySQL에서 근무하는 엔지너어들이 2006년에 설립한 MySQL 관련 컨설팅 전문 회사이며 2010년 MySQL이 Oracle로 인수되면서 MySQL fork DBMS로 Percona Server를 출시하였다.

Percona Server의 스레드 풀은 플러그인 형태로 되어 있다.

https://docs.percona.com/percona-server/8.0/installation.html

  • thread_pool_size
    • 스레드 풀 크기 설정
    • 기본 값은 CPU 코어 개수로 설정 되어 있으며, 일반적으로도 코어 개수로 설정하는 편
  • thread_pool_max_threads
    • 스레드 풀이 생성할 수 있는 최대 스레드 수를 설정
  • thread_pool_oversubscribe
    • 동시 실행할 수 있는 스레드 수를 설정
    • 스레드 풀은 보통 한 번에 한 개의 active 스레드를 갖는데
    만약 타이머 스레드가 지연(stall)을 감지하면 스레드 그룹에 active 스레드를 추가할 수 있다
    • 이 값이 너무 크면 스케줄링 해야 할 스레드가 많아저져 스레드 풀이 비효율적으로 동작할 수도 있다
    • 기본값은 3
  • thread_pool_high_prio_mode
    • 우선 순위 큐를 활성화 하는지 설정
    • 스레드의 총 개수는 이 값을 넘길 수 없다
  • thread_pool_high_prio_tickets
    • 우선 순위 큐에 들어갈 수 있는 최대 티켓 수를 설정
  • thread_pool_idle_timeout
    • 유휴 스레드가 종료되기까지 기다리는 시간을 설정
    • 기본값은 60초
  • thread_pool_stall_limit
    • 스레드가 지연될 때 스레드를 새로 생성할지 여부를 결정하는 시간
    • 주기적으로 스레드 그룹들의 상태를 체크한다
    • 응답시간에 민감한 서비스일 경우 적절히 낮춰서 설정해야 한다
    • 기본값은 500ms

선순위, 후순위 큐를 이용한 작업 순서 재배치

Percona의 플러그인의 선순위 큐와 후순위 큐를 이용해 특정 트랜잭션이나 쿼리를 우선적으로 처리할 수 있다.

Thread Pool Sequence
Thread Pool Sequence

작업 순서를 재배치하여 트랜잭션들이 최대한 빨리 종료될 수 있도록 한다.

참고 내용

@lim
기억은 기록기록