1. Thread pool 이란?
thread를 미리 생성해놓고 적절하게 관리하는 시스템
2. connection pool이라는 것도 있던데?
개념이 조금 다른데 위키디피아 내용으로 정리한다.
#thread_pool vs Connection pool
#connection pool
In software engineering, a connection pool is a cache of database connections maintained so that the connections can be reused when future requests to the database are required
Connection pools are used to enhance the performance of executing commands on a database
Opening and maintaining a database connection for each user, especially requests made to a dynamic database-driven website application, is costly and wastes resources
In connection pooling, after a connection is created, it is placed in the pool and it is used again so that a new connection does not have to be established
If all the connections are being used, a new connection is made and is added to the pool
Connection pooling also cuts down on the amount of time a user must wait to establish a connection to the database.
소프트웨어 엔지니어링에서 연결 풀은 데이터베이스에 대한 향후 요청이 필요할 때 연결을 재사용할 수 있도록 유지 관리하는 데이터베이스 연결의 캐시다.
연결 풀은 데이터베이스에서 명령을 실행하는 성능을 향상시키는 데 사용된다.
각 사용자에 대한 데이터베이스 연결, 특히 동적 데이터베이스 기반 웹 사이트 응용프로그램에 대한 요청은 비용이 많이 들고 자원을 낭비한다.
연결 풀링에서는 연결이 생성된 후 풀에 배치하고 다시 사용하므로 새 연결을 설정할 필요가 없다.
모든 연결을 사용하는 경우 새 연결이 만들어지고 풀에 추가된다.
또한 연결 풀링은 데이터베이스에 대한 연결을 설정하기 위해 사용자가 기다려야 하는 시간을 줄인다.
--> mysql에서는 connection(thread)을 미리 생성해놓고 재사용하는 용도 thread_cache_size가 이 개념과 비슷하다.
#thread pool
In computer programming, a thread pool is a software design pattern for achieving concurrency of execution in a computer program.
Often also called a replicated workers or worker-crew model,[1] a thread pool maintains multiple threads waiting for tasks to be allocated for concurrent execution by the supervising program.
By maintaining a pool of threads, the model increases performance and avoids latency in execution due to frequent creation and destruction of threads for short-lived tasks.[2]
The number of available threads is tuned to the computing resources available to the program, such as a parallel task queue after completion of execution.
컴퓨터 프로그래밍에서, 스레드 풀은 컴퓨터 프로그램에서 실행의 동시성을 달성하기 위한 소프트웨어 설계 패턴이다.
종종 복제된 작업자 또는 작업자 스크루 모델이라고도 하며, 스레드 풀은 감독 프로그램에 의해 동시 실행이 할당되기를 기다리는 여러 개의 스레드를 유지한다.
이 모델은 스레드 풀을 유지함으로써 성능을 높이고 단명 작업에 대한 스레드 생성 및 파괴가 빈번해 실행 지연을 방지한다.
사용 가능한 스레드 수는 실행 완료 후 병렬 작업 대기열과 같이 프로그램에서 사용할 수 있는 컴퓨팅 리소스에 맞춰 조정된다.
--> connection(thread)을 미리 생성해놓고 재사용하면서 DB 트랜잭션을 관리하여 부하를 줄인다.
mysql에서만 보면 connection pool의 개념에서 부하를 관리할 수 있게 좀 더 나아간 버전(thread_pool_size)으로 보면 될 듯하다.
3. Mysql Thread pool
mysql은 클라이언트에서 접속을 요청할 때마다 해당 요청을 수행하는 스레드를 생성한다.
스레드(connection)를 생성할 때 스레드에서 필요한 thread_stack 등 기본적으로 사용할 메모리를 같이 할당한다.
(평소에는 그렇지 않겠지만 이러한 작업이 반복되다 적정임계치가 넘어서게 되면 DB에 부하를 발생시킨다.)
mysql commuity 버전은 thread pool을 사용할 수 없고
mysql enterprise 버전과 MariaDB에서만 사용가능하다.
mysql에서 스레드풀 사용이 유료 라이선스인 이유는 동시접속이 몰려 부하가 발생했을 때 알 수 있는데 아래 그림이 그것을 설명한다.
4. mysql thread pool의 이점 상세내용
여기에서 설명한 내용이 너무 잘되있어서 그대로 차용하였다.
참조: xdhyix.wordpress.com/2015/06/29/mysql-%EC%8A%A4%EB%A0%88%EB%93%9C%ED%92%80/
1) MySQL 서버가 쿼리 수행을 위한 충분한 CPU와 메모리 리소스를 확보할 때까지 쿼리 수행을 기다림
2) 커넥션에 대한 진행중인 트랜잭션 쿼리의 우선순위를 매김
3) 쓰레드를 그룹으로 나누어 그룹당 하나의 액티브 쓰레드를 관리하는데 목표를 두고 동작
4) 쿼리가 지연처리 되거나 오랜시간 수행될 때 데드락을 피함
5. 결론
엄청나게 트랜잭션이 몰리는 시스템이면 thread pool을 쓰는 게 좋겠지만 오픈소스 DB를 사용하는 목적에 기본적으로 비용절감이라는 것이 있기 때문에 적절하게 thread_cache_size 튜닝을 한다면 어느정도 시스템 안정성을 보장할 수 있다.
-> Clone DB인 MariaDB에서는 무료버전에서도 thread pool을 사용할 수 있다. 개인적으로 상용서비스에서 mysql에서 MariaDB로 가는게 조금 꺼려지는 이유는 장애시 로그에 대한 러퍼런스를 찾기가 쉽지 않다. mysql보다 관련내용이 많이 부족하다. 비슷하지만 detail에서는 조금 다르다.
현재도 상용서비스에 Mysql , MariaDB 다 쓰고 있지만 장애 때 MariaDB쪽에 문제가 생기면 조금 더 부담이 되는 것은 사실이다. ㅎㅎ
끝~
'RDB > mysql' 카테고리의 다른 글
[튜닝] thread cache miss rate 1%를 향해 (mysql parameter tuning) (0) | 2020.09.29 |
---|---|
[튜닝] 유물발굴 (mysql tuning using heavy query) (0) | 2020.09.18 |
mysql을 시작하기 전에 2 (0) | 2020.08.11 |
mysql을 시작하기 전에 1 (0) | 2020.08.04 |
mysql swap 메모리 사용 초기화 (0) | 2020.07.22 |