DB/MySQL

MySQL 멀티 쓰레딩

행운개발자 2024. 1. 28. 17:08
728x90

MySQL의 멀티쓰레딩

MySQL 서버는 프로세스 기반이 아니라 쓰레드 기반으로 동작한다. MySQL에서 사용하는 쓰레드는 크게 Foreground, Background 쓰레드로 구분할 수 있다.

SELECT thread_id, name, type FROM performance_schema.threads ORDER BY type, thread_id;

 

MySQL 서버에서 실행 중인 대부분의 쓰레드는 Background 쓰레드이고, 일부만 Foreground 타입이다. 위 사진에서 마지막에 있는 thread/sql/one_connection 쓰레드가 사용자의 요청을 처리하는 Foreground 쓰레드이다. 같은 이름의 쓰레드가 2개보이는 것은 여러 쓰레드가 동일한 작업을 병렬로 처리하고 있는 경우이다.

Foreground 쓰레드는 최소 MySQL 서버에 접속된 클라이언트의 수만큼 존재한다.주로 각 클라이언트 사용자가 요청하는 쿼리 문장을 처리한다. 클라이언트 사용자가 작업을 마치고 커넥션을 종료하면 해당 커넥션을 담당하던 쓰레드는 다시 쓰레드 캐시 또는 쓰레드 풀로 돌아간다.

Foreground 쓰레드는 MySQL의 데이터 버퍼나 캐시로부터 데이터를 가져오고, 버퍼나 캐시에 데이터가 없는 경우에는 직접 디스크의 데이터나 인덱스 파일로부터 데이터를 읽어와서 작업을 처리한다. 이러한 동작과정은 스토리지 엔진에 따라서 달라지기도 하는데, MyISAM는 디스크 쓰기 작업까지 Foreground 쓰레드가 처리하지만, InnoDB는 데이터 버퍼나 캐시까지만 Foreground가 처리하고 디스크를 기록하는 작업은 Background 쓰레드가 담당한다.

MyISAM과 InnoDB에서 Foreground 쓰레드 역할의 차이는 일반적인 상용 DBMS에서 제공하는 쓰기 버퍼 작업에 영향을 미친다. MyISAM에서는 Foreground 쓰레드가 쓰기 작업까지 수행하도록 설계되었기 때문에, 쓰기 버퍼링 기능을 사용할 수 없다. 반면에 InnoDB에서는 INSERT, UPDATE, DELETE 쿼리로 데이터가 변경되는 경우 데이터가 디스크의 데이터 파일로 완전히 저장될 때까지 기다리지 않아도 된다.

Background 쓰레드가 하는 역할이 여러가지가 있지만 가장 중요한 것은 2가지이다. (앞서 보았던 것처럼 Background 쓰레드가 역할에 따라서 수십 개가 있고 아래의 두 가지는 그 역할의 일부이다.)

  1. 로그를 디스크로 기록
  2. 데이터를 버퍼로 읽어 오는 역할

MySQL 5.5 버전부터 데이터 쓰기와 읽기를 담당하는 쓰레드의 갯수를 2개 이상 지정할 수 있게 되었고, 아래의 시스템 변수로 확인/설정이 가능하다.

SHOW VARIABLES LIKE '%io_threads';

728x90

'DB > MySQL' 카테고리의 다른 글

MySQL 쿼리 실행 구조  (0) 2024.01.28
MySQL 메모리 구조  (0) 2024.01.28
MySQL 아키텍처  (0) 2024.01.28
MySQL 시스템 변수 조회 및 변경  (0) 2024.01.28
MySQL 업그레이드 주의사항  (1) 2024.01.28