14.13.5 InnoDB의 스레드 병렬성 구성
InnoDB
는 운영 체제 스레드 를 사용하여 사용자 트랜잭션의 요청을 처리합니다. (트랜잭션은 커밋 또는 롤백하기 전에 InnoDB
에 다수의 요청을 발행 할 수 있습니다.) 컨텍스트 스위칭이 효율적인 멀티 코어 프로세서를 갖춘 최신 운영 체제 및 서버에서는 병렬 스레드 수 을 제한하지 않고 대부분의 워크로드가 제대로 작동합니다. MySQL 5.5 이상에서의 확장 성 향상에 의해, InnoDB
내부의 병렬 실행중인 스레드의 수를 제한 할 필요성은 감소합니다.
스레드 간의 컨텍스트 스위칭을 최소화 도움이 상황에서는 InnoDB
는 몇 가지 기법을 사용하여 병렬 실행중인 운영 체제 스레드 수 (따라서 한 번에 처리되는 요청 수)를 제한 수 있습니다. InnoDB
가 사용자 세션에서 새 요청을 수신했을 때, 병렬 실행중인 스레드의 수가 미리 정의 된 제한에 도달하면 그 새로운 요구는 재시도 전에 짧은 시간 동안 대기합니다. 수면 후 재조정 할 수없는 요구는 선입 선출 큐에 결국 처리됩니다. 락을 대기하고있는 thread는 병렬 실행중인 스레드 수에 포함되지 않습니다.
병렬 스레드 수 구성 매개 변수 innodb_thread_concurrency
를 설정하여 제한 할 수 있습니다. 실행중인 스레드의 수가이 한계에 도달하면 추가 스레드는 큐에 넣어지기 전에 구성 매개 변수 innodb_thread_sleep_delay
로 구성된 마이크로 초만큼 대기합니다.
이전에는 innodb_thread_sleep_delay
의 최적 값을 찾기 위해 실험이 필요하며, 그 최적 값도 작업 부하에 따라 변화 할 수있었습니다. MySQL 5.6.3 이후에서는 구성 옵션 innodb_adaptive_max_sleep_delay
을 innodb_thread_sleep_delay
허용하는 가장 큰 값으로 설정할 수 있으며, InnoDB
가 현재의 thread 스케줄링 활동에 따라 innodb_thread_sleep_delay
를 위 또는 아래로 자동으로 조정합니다. 이 동적 조정 시스템에 걸리는 부하가 적은 기간이나 시스템이 거의 가득 찬 용량으로 작동하는 기간 스레드 스케줄링 메커니즘이 원활하게 작동하는 데 도움이됩니다.
innodb_thread_concurrency
의 기본값과 병렬 스레드 수에 대한 암묵적인 기본 제한은 MySQL과 InnoDB
의 다양한 릴리스에서 변경되어 왔습니다. 현재 기본적으로 병렬 실행중인 스레드 수에 제한이 없도록 innodb_thread_concurrency
의 기본값은 0
입니다.
InnoDB
가 스레드를 대기시키는 병렬 스레드의 수가 제한되어있는 경우뿐만된다는 점에 유의하십시오. 스레드 수에 제한이 없으면 모든 것이 동등하게 경쟁하여 예약됩니다. 즉, innodb_thread_concurrency
가 0
인 경우는 innodb_thread_sleep_delay
값은 무시됩니다.
스레드 수에 제한이있다 ( innodb_thread_concurrency
> 0 인 경우) InnoDB
는 하나의 SQL 문 실행 중에 발행 된 여러 요청이 innodb_thread_concurrency
에서 설정된 제한 사항을 준수하지 않고 InnoDB
에 들어가는 것을 허용함으로써 컨텍스트 스위칭 오버 헤드를 줄일 수 있습니다. SQL 문 (조인)는 InnoDB
에서 여러 행 조작으로 구성되어있을 가능성이 있기 때문에 InnoDB
는 스레드가 최소한의 오버 헤드로 반복 예약하는 것을 허용하는 지정된 수의 '티켓 "을 할당합니다.
새로운 SQL 문이 시작되면 스레드는 티켓이 없기 때문에 innodb_thread_concurrency
에 따라야합니다. 스레드가 InnoDB
에 들어가게되면 그 스레드는 행 작업을 수행하기 위해 나중에 InnoDB
에 들어갈 때 사용할 수있는 여러 티켓이 할당됩니다. 그 티켓이 소진 된 경우 스레드는 삭제되고 다시 innodb_thread_concurrency
에 따릅니다. 그러면 그 스레드가 대기 중의 thread의 선입 선출 큐에 리턴 할 수 있습니다. 스레드가 다시 InnoDB
에 들어가게되면 티켓이 다시 할당됩니다. 할당 된 티켓의 수는 글로벌 옵션 innodb_concurrency_tickets
(기본적으로 5000,5.6.6 이전 500)로 지정됩니다. 락을 대기하고있는 thread는 잠금이 사용 가능하게되면 티켓이 하나 주어집니다.
이러한 변수의 올바른 값은 환경과 워크로드에 따라 다릅니다. 응용 프로그램에서 어떤 값이 작동하는지 확인하려면 다른 값을 시도해보십시오. 병렬 실행중인 스레드의 수를 제한하기 전에 멀티 코어 및 멀티 프로세서 컴퓨터에서 InnoDB
의 성능을 향상시킬 수있는 구성 옵션 ( innodb_adaptive_hash_index
등)을 확인하십시오.
MySQL 스레드 처리에 관한 일반적인 성능 정보는 섹션 8.11.5.1 「MySQL의 클라이언트 연결을위한 스레드 사용 " 을 참조하십시오.