MySQL InnoDB Thread Concurrency 설정하기
- Ref. Configuring Thread Concurrency for InnoDB
- InnoDB는 user transaction의 request를 처리하기 위해서 OS threads를 사용한다. (Transaction은 commit이나 rollback전에 InnoDB에 다수의 request를 발행한다)
- 요즘 OS, Server는 multi-core processor이고, context switching도 효율적으로 처리하고 있기 때문에, 일반적인 workloads에서는 concurrent threads를 제한하지 않아도 무방하다.
- context switching을 최소화시켜야하는 상황인 경우, InnoDB에서 동시 수행 쓰레드 개수를 제한하는 몇가지 방법을 사용할수 있다.
Notes
- InnoDB가 제한된 개수 이상의 쓰레드 요청을 받은 경우, 새로운 request는 잠시동안 sleep했다가 재시도 하게 된다. 재시도시에도 실행되지 못한 request는 FIFO queue에 들어가고, 추후에 실행된다.
-
lock을 대기하는 thread는 동시 수행 쓰레드 개수에 카운트 되지 않는다.
- innodb_thread_concurency
- 동시 쓰레드 개수 제한
- 이 제한에 도달하면, 새로운 thread는 innodb_thread_sleep_delay동안 sleep한다.
- default : 버전별로 다름. MySQL 5.6에서는 0(제한없음)
- innodb_thread_concurrency가 0인경우, innodb_thread_sleep_delay는 무시된다.
- innodb_thread_concurrency가 0이상인 경우에도 context switching overhead를 줄이기 위해서 하나의 SQL문에서 여러개의 request를 요청하는 경우, innodb_thread_concurrency의 설정을 준수하지 않고 허용한다. 예를들면 join문 같은 경우 multiple row operations을 수행하게 될텐데 이때 할당받은 “tickets”을 사용하여 overhead없이 반복적으로 쓰레드를 실행할수 있다. 새로운 SQL문이 시작되었을때는 무조건 innodb_thread_concurrency 설정을 확인하고 준수한다. 이 쓰레드가 실행될 권한을 얻게 되면, 부수적인 row operations를 위한 innodb_concurrency_tickets에 설정된 개수만큼의 티켓을 얻게 된다. 티켓이 다 소진되면, 이 쓰레드는 다시 innodb_thread_concurrency 를 다시 재확인하고 재실행되거나, 큐잉된다.
- innodb_thread_sleep_delay
- InnoDB queue에 들어가기전에 얼마나 sleep할것인가.
- default : 10000(microseconds)
- 이전버전에서는 workload에 따라 적정한 value가 무엇인지 시험해봐야했다.
- MySQL 5.6.3부터는 innodb_adaptive_max_sleep_delay를 사용해서 최대값을 지정할 수 있고, innodb_thread_sleep_delay는 InnoDB가 자동으로 조정한다.
- innodb_adaptive_max_sleep_delay
- 이 값을 0 이상의 값으로 지정하면, InnoDB가 innodb_thread_sleep_delay를 자동으로 조정한다.
- default : 150000(microseconds)
- MySQL 5.6.3버전부터 소개됨.
- innodb_concurrency_tickets
- 한번 스케줄링된 쓰레드는 설정된 티켓개수만큼 자유롭게 InnoDB를 사용할수 있다.
- default : 5000(>= 5.6.6), 500(<= 5.6.5)
- innodb_thread_concurency