Loading...
MySQL 9.5 Reference Manual 9.5의 17.8.8 Configuring Spin Lock Polling의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
InnoDB mutexes와
rw-locks는 일반적으로
짧은 시간 동안만 유지되도록 예약됩니다. 멀티코어 시스템에서는,
스레드가 슬립 상태가 되기 전에 일정 기간 동안 mutex나 rw-lock을
획득할 수 있는지 계속해서 확인(폴링)하는 것이 더 효율적일 수
있습니다. 이 기간 동안 mutex나 rw-lock을 사용할 수 있게 되면,
스레드는 동일한 타임 슬라이스 안에서 즉시 계속 실행될 수 있습니다.
그러나 여러 스레드가 mutex나 rw-lock과 같은 공유 오브젝트를 지나치게
자주 폴링하면 “캐시 핑퐁”이 발생할 수 있으며,
그 결과 프로세서들이 서로의 캐시 일부를 무효화하게 됩니다.
InnoDB는 폴링을 비동기화하기 위해
폴 사이에 무작위 지연을 강제하여 이 문제를 최소화합니다.
무작위 지연은 스핀 대기 루프로 구현됩니다.
스핀 대기 루프의 지속 시간은 루프 내에서 발생하는 PAUSE 명령어
개수에 의해 결정됩니다. 이 수는 0 이상
innodb_spin_wait_delay 값 미만의 정수를 무작위로 선택하고,
그 값을 50으로 곱하여 생성됩니다. 예를 들어,
innodb_spin_wait_delay 설정이 6인 경우,
다음 범위에서 정수가 무작위로 선택됩니다:
{0,1,2,3,4,5}
선택된 정수는 50과 곱해져, 다음과 같은 여섯 개의 가능한 PAUSE 명령어 값 중 하나가 됩니다:
{0,50,100,150,200,250}
이 값 집합에서, 250은 스핀 대기 루프에서 발생할 수 있는
PAUSE 명령어의 최대 개수입니다.
innodb_spin_wait_delay 설정이 5이면
가능한 값 집합은 {0,50,100,150,200}이 되고,
이때 200이 PAUSE 명령어의 최대 개수가 됩니다. 이런 방식으로
innodb_spin_wait_delay 설정이
스핀 락 폴 사이의 최대 지연을 제어합니다.
모든 프로세서 코어가 빠른 캐시 메모리를 공유하는 시스템에서는,
최대 지연을 줄이거나
innodb_spin_wait_delay=0으로 설정하여
바쁜 루프를 완전히 비활성화할 수도 있습니다. 여러 프로세서 칩이
있는 시스템에서는 캐시 무효화 효과가 더 클 수 있으며,
이 경우 최대 지연을 늘릴 수도 있습니다.
100MHz Pentium 시대에는
innodb_spin_wait_delay 단위가
1마이크로초와 동일하도록 보정되었습니다. 그 시간
동등성은 유지되지 않았지만, PAUSE 명령어 지속 시간은 다른 CPU
명령어에 비해 프로세서 사이클 관점에서 Skylake 세대 프로세서가
도입될 때까지 비교적 일정하게 유지되었습니다. Skylake 세대
프로세서는 상대적으로 더 긴 PAUSE 명령어를 가지고 있습니다.
innodb_spin_wait_pause_multiplier
변수는 PAUSE 명령어 지속 시간 차이를 보정할 수 있는 방법을
제공합니다.
innodb_spin_wait_pause_multiplier
변수는 PAUSE 명령어 값의 크기를 제어합니다. 예를 들어,
innodb_spin_wait_delay 설정이 6이라고
가정하면,
innodb_spin_wait_pause_multiplier
값을 50(기본값이자 이전에 하드코딩된 값)에서 5로 줄이면,
더 작은 PAUSE 명령어 값 집합이 생성됩니다:
{0,5,10,15,20,25}
PAUSE 명령어 값을 증가 또는 감소시킬 수 있는 기능을 통해
서로 다른 프로세서 아키텍처에 맞게 InnoDB를
미세 조정할 수 있습니다. 예를 들어, 상대적으로
더 긴 PAUSE 명령어를 가진 프로세서 아키텍처에는
더 작은 PAUSE 명령어 값이 적합할 수 있습니다.
innodb_spin_wait_delay와
innodb_spin_wait_pause_multiplier
변수는 동적입니다. 이 변수들은 MySQL 옵션 파일에서 지정하거나,
SET GLOBAL
문을 사용하여 런타임에 수정할 수 있습니다.
런타임에 변수를 수정하려면 글로벌 시스템 변수를 설정할 수 있을
만큼 충분한 권한이 필요합니다. 자세한 내용은
Section 7.1.9.1, “System Variable Privileges”를
참조하십시오.
17.8.7 Configuring InnoDB I/O Capacity
17.8.9 Purge Configuration