22.2.3.1 성능 스키마 이벤트 타이밍
이벤트 서버 소스 코드에 추가 된 계측을 사용하여 수집됩니다. instrument는 이벤트 시간을 측정하지만, 이것은 성능 스키마가 이벤트에 얼마나 시간이 걸리는지를 알리는 방법입니다. 타이밍 정보를 수집하지 않도록 instrument를 구성 할 수 있습니다. 이 섹션에서는 사용 가능한 타이머와 그 특성 및 이벤트의 타이밍 치를 나타내는 방법에 대해 설명합니다.
두 테이블은 타이머 정보를 제공합니다.
performance_timers
는 사용 가능한 타이머와 그 특성을 나열합니다.setup_timers
은 어떤 타이머가 어떤 instrument에 사용되는지를 보여줍니다.
setup_timers
의 각 타이머 라인은 performance_timers
에 표시된 하나의 타이머를 표시해야합니다.
타이머의 정밀도와 그 오버 헤드의 양은 다양하다. 사용 가능한 타이머와 그 특성을 확인하려면 performance_timers
테이블을 확인하십시오.
mysql> SELECT * FROM performance_timers;
+-------------+-----------------+------------------+----------------+
| TIMER_NAME | TIMER_FREQUENCY | TIMER_RESOLUTION | TIMER_OVERHEAD |
+-------------+-----------------+------------------+----------------+
| CYCLE | 2389029850 | 1 | 72 |
| NANOSECOND | 1000000000 | 1 | 112 |
| MICROSECOND | 1000000 | 1 | 136 |
| MILLISECOND | 1036 | 1 | 168 |
| TICK | 105 | 1 | 2416 |
+-------------+-----------------+------------------+----------------+
TIMER_NAME
컬럼은 사용 가능한 타이머의 이름이 표시됩니다. CYCLE
은 CPU (프로세서) 사이클 카운터에 따라 타이머를 나타냅니다. 특정 타이머에 관련된 값이 NULL
의 경우 타이머는 플랫폼에서 지원되지 않습니다. NULL
없는 행은 setup_timers
에서 사용할 수있는 타이머를 보여줍니다.
TIMER_FREQUENCY
는 초당 타이머 단위 수를 나타냅니다. 사이클 타이머의 경우 주파수는 일반적으로 CPU 속도에 관련합니다. 표시된 값은 2.4GHz 프로세서를 탑재 한 시스템에서 검색되었습니다. 다른 타이머는 정해진 몇 초를 기준으로합니다. TICK
의 경우 빈도는 플랫폼마다 다를 수 있습니다 (예를 들어, 100 틱 / 초를 사용하는 것이나, 1000 틱 / 초를 사용하는 것이 있습니다).
TIMER_RESOLUTION
타이머 값이 동시에 증가하는 타이머 단위 수를 나타냅니다. 타이머의 해상도가 10의 경우, 그 값은 매번 10 씩 증가합니다.
TIMER_OVERHEAD
은 특정 타이머 하나의 타이밍을 취득하기위한 오버 헤드의 최소 사이클 수입니다. 타이머는 이벤트의 시작과 끝에서 호출되므로 이벤트 당 오버 헤드는 표시된 값의 2 배가됩니다.
유효한 타이머를 확인하고 타이머를 변경하려면 setup_timers
테이블에 액세스합니다.
mysql>SELECT * FROM setup_timers;
+-----------+-------------+ | NAME | TIMER_NAME | +-----------+-------------+ | idle | MICROSECOND | | wait | CYCLE | | stage | NANOSECOND | | statement | NANOSECOND | +-----------+-------------+ mysql>UPDATE setup_timers SET TIMER_NAME = 'MICROSECOND'
->WHERE NAME = 'idle';
mysql>SELECT * FROM setup_timers;
+-----------+-------------+ | NAME | TIMER_NAME | +-----------+-------------+ | idle | MICROSECOND | | wait | CYCLE | | stage | NANOSECOND | | statement | NANOSECOND | +-----------+-------------+
기본적으로 성능 스키마는 각 instrument의 종류에서 사용할 수있는 최고의 타이머를 사용하지만 사용자가 다른 하나를 선택할 수 있습니다.
대기 시간을 측정하는 가장 중요한 기준은 타이머의 정밀도를 희생 할 수 있어도 부담을 줄일 수 있기 때문에 CYCLE
타이머를 사용하는 것이 가장 좋습니다.
문 (또는 스테이지) 실행하는 데 걸리는 시간은 일반적으로 단일 대기의 실행에 걸리는 시간보다 몇 배나 커집니다. 문의 시간을 측정하는 데 가장 중요한 기준은 프로세서의 주파수 변경에 영향을받지 않는 정확한 측정 기준을 설정할 수 있기 때문에 사이클에 근거하지 않은 타이머를 사용하는 것이 가장 적절한 입니다. 문의 기본 타이머는 NANOSECOND
입니다. 타이머를 2 회 호출 (문 시작할 때 한 번, 그 끝에 1 회)함으로써 발생하는 오버 헤드는 문 자체의 실행에 사용되는 CPU 시간에 비해 현격 한 차이 작기 때문에 사이클 타이머와 비교 한 추가 "오버 헤드"는 크지 않습니다. CYCLE
타이머를 사용하는 것에 메리트가없고, 단점뿐입니다.
사이클 카운터에 의해 제공되는 정밀도는 프로세서 속도에 따라 다릅니다. 프로세서 1 GHz (10 억 사이클 / 초) 이상에서 실행하는 경우 사이클 카운터는 나노초 미만의 정확도를 제공합니다. 사이클 카운터를 사용하는 것은 실제로 시간을 좀 더 훨씬 부하가 줄어 듭니다. 예를 들어, 표준 gettimeofday()
함수는 수백 사이클 걸릴 수 있으며, 이것은 초당 수천 또는 수백만 번 발생할 수있는 데이터 수집은 허용 할 수없는 오버 헤드입니다.
사이클 카운터는 단점도 있습니다.
최종 사용자는 몇 분의 1 초 등의 시계 단위로 타이밍을 아는 것을 기대합니다. 사이클에서 초로 변환하는 것은 큰 부하가 걸릴 수 있습니다. 따라서 변환은 빠르게 꽤 대략적인 곱셈 연산입니다.
노트북이 절전 모드에있을 때와 열 생성을 줄이기 위해 CPU의 속도가 저하 된 경우와 같이 프로세서 사이클 속도가 달라질 수 있습니다. 프로세서의 사이클 변동 환율했을 경우, 사이클에서 실시간 단위로 변환 오류가 발생할 수 있습니다.
사이클 카운터는 프로세서 및 운영 체제에 신뢰할 수 없거나 사용할 수없는 경우가 있습니다. 예를 들어, Pentium는 명령은
RDTSC
(C 명령이 아니라 어셈블리 언어)이며, 이론적 운영 체제는 사용자 모드 프로그램의 사용을 방해 할 수 있습니다.이상 실행 또는 멀티 프로세서 동기화에 대한 일부 프로세서의 세부 사항 때문에 카운터가 최대 1000 사이클마다 고속 지거나 느려지거나하는 것처럼 보일 수 있습니다.
현재 MySQL은 x386 (Windows, OS X, Linux, Solaris 및 기타 Unix 맛), PowerPC 및 IA-64의 사이클 카운터와 함께합니다.
setup_instruments
테이블에 이벤트를 수집하는 instrument를 나타내는 ENABLED
열 수 있습니다. 이 테이블에는 시간이 측정되는 instrument를 나타내는 TIMED
열 수 있습니다. instrument가 설정되어 있지 않은 경우, 이벤트를 생성하지 않습니다. 사용되는 instrument의 시간이 측정되지 않는 경우 instrument에 의해 생성 된 이벤트 TIMER_START
, TIMER_END
및 TIMER_WAIT
타이머 값이 NULL
입니다. 따라서 요약 테이블의 총, 최소, 최대 및 평균 시간 값을 계산할 때 그 값이 무시됩니다.
이벤트에서 이벤트의 타이밍을 시작할 때 유효한 타이머에 의해 지정된 단위로 시간이 저장됩니다. 표시는 선택된 타이머에 상관없이 시간은 표준 단위 정상화하기 위해 피코 초 (1 조분의 1 초)로 표시됩니다.
setup_timers
테이블에 변경 사항은 즉시 모니터링에 영향을줍니다. 이미 진행중인 이벤트 시작 시간에 원래의 타이머를 사용하여 종료 시간에 새로운 타이머를 사용할 수 있기 때문에 예측할 수없는 결과를 초래할 수 있습니다. 타이머를 변경 한 경우 TRUNCATE TABLE
을 사용하여 성능 스키마의 통계를 재설정해야하는 경우가 있습니다.
서버 시작 성능 스키마의 초기화 타이머 기준 ( "시간 제로")가 발생합니다. 이벤트의 TIMER_START
및 TIMER_END
값은 기준선 이후 피코 초를 나타냅니다. TIMER_WAIT
값은 피코 초 기간입니다.
이벤트의 피코 초 값은 대략입니다. 그 정도는 어느 단위에서 다른 단위로 변환에 따른 일반적인 오차의 형식에 좌우됩니다. CYCLE
타이머가 사용되고 프로세서의 속도가 서로 다를 드리프트가 발생할 수 있습니다. 따라서 서버의 시작 이후 경과 한 시간의 정확한 측정 기준으로 이벤트의 TIMER_START
값을 보는 것은 타당하지 않습니다. 한편, 시작 시간과 기간에 따라 이벤트를 지정하는 데, ORDER BY
절에 TIMER_START
값 또는 TIMER_WAIT
값을 사용하는 것이 좋습니다.
이벤트에서 마이크로 초 등의 값이 아니라 피코 초를 선택한 것은 성능상의 근거가 있습니다. 하나의 구현 목표는 타이머에 관계없이 통일 된 시간 단위로 결과를 표시하는 것이 었습니다. 이상적인 세계에서는이 시간 단위 시계 단위 듯 적당히 정확, 즉 마이크로 초입니다. 그러나 사이클 또는 나노초를 마이크로 세컨드로 변환하려면 모든 계측에서 나누기를 수행해야하는 경우가 있습니다. 나누기는 많은 플랫폼에서 높은 부하가 걸립니다. 곱셈은 부하가 높지 않기 때문에 그것을 사용하고 있습니다. 따라서 시간 단위는 큰 정밀도의 손실이 없도록 충분히 큰 승수를 사용하여 가능한 한 최대의 TIMER_FREQUENCY
값의 정수 배수입니다. 그 결과, 시간 단위가 '피코'입니다. 이 정도는 유사하지만,이 결정에 따라 오버 헤드를 최소화 할 수 있습니다.