Skip to main content

MySQL 스레딩 구조

MySQL 스레딩 구조

  • MySQL 서버는 프로세스가 아닌 스레드 기반으로 동작

  • 스레드는 크게 Foreground 스레드Background 스레드 두 종류로 구분

  • MySQL 서버의 실행 중인 스레드 목록 조회 명령어

    SELECT thread_id, name, type, processlist_user, processlist_host
    FROM performance_schema.threads ORDER BY type, thread_id;
    
  • 사용자의 요청을 처리하는 Foreground 스레드는 thread/sql/one_connection 스레드

  • Background 스레드의 개수는 MySQL 서버 설정으로 조절 가능


Foreground 스레드 (클라이언트 스레드)

  • MySQL 서버에 연결된 클라이언트의 수만큼 존재함
    • 각 클라이언트 유저가 요청한 쿼리 문장을 처리
  • 사용자가 작업을 마친 후 커넥션을 종료하면 해당 커넥션을 담당하던 스레드는 스레드 캐시로 돌아감
    • 단, 스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 존재하면 캐시에 넣지 않고 스레드를 종료시킴
    • 스레드 캐시에서 항상 일정한 스레드 개수 유지
    • 유지할 스레드 개수는 thread_cache_size 시스템 변수로 설정 가능
  • Foreground 스레드는 데이터를 MySQL의 데이터 버퍼캐시로부터 조회
    • 버퍼나 캐시에 없는 경우 직접 디스크의 데이터나 인덱스 파일로부터 조회한 후 작업 처리
    • MyISAM 테이블은 디스크 쓰기 작업까지 Foreground 스레드가 처리
    • InnoDB 테이블은 데이터 버퍼캐시까지는 Foreground 스레드가 처리하고 디스크 기록은 Background 스레드가 처리

Background 스레드

  • InnoDB에서 여러 가지의 작업을 Background 스레드로 처리
    • Insert Buffer를 병합하는 스레드
    • 로그를 디스크로 기록하는 스레드
    • InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
    • 데이터를 버퍼로 읽어 오는 스레드
    • 잠금이나 데드락을 모니터링하는 스레드
  • 가장 중요한 스레드는 로그 스레드와 버퍼의 데이터를 디스크로 기록하는 쓰기 스레드
  • MySQL 5.5 버전부터 쓰기 스레드읽기 스레드의 개수를 2개 이상 지정할 수 있음
    • innodb_read_io_threads: 데이터를 주로 클라이언트 스레드에서 처리되기에 많이 설정할 필요 없음
    • innodb_write_io_threads: 많은 작업을 Background로 처리하기에 일반적인 내장 디스크 활용 시 2~4개 권장
  • 사용자의 요청을 처리하는 도중 데이터 쓰기 작업은 지연(버퍼링)되어 처리 가능
  • 데이터의 읽기 작업은 절대 지연될 수 없음
    • 예시: SELECT 쿼리 실행 후 요청된 SELECT 응답을 10분 뒤에 돌려주는 DBMS는 존재하지 않음
  • 일반적인 상용 DBMS는 대부분 쓰기 작업을 버퍼링해 일괄 처리하는 기능이 탑재됨
    • 단, 예외로 MyISAM의 경우 사용자 스레드가 쓰기 작업까지 함께 처리하도록 설계
  • InnoDB에서는 INSERT, UPDATE, DELETE 쿼리로 데이터가 변경되는 경우 데이터가 디스크에 완전히 기록될 때까지 기다리지 않아도 됨
    • MyISAM에서는 일반적인 쿼리는 쓰기 버퍼링 기능 사용 불가

메모리 할당 및 사용 구조