22.1 성능 스키마 빠른 시작
이 섹션에서는 그 사용 방법을 나타내는 예에 따라 성능 스키마에 대해 간략하게 소개합니다. 추가 예제는 섹션 22.15 "문제를 진단하기위한 성능 스키마 사용" 을 참조하십시오.
성능 스키마를 사용할 수 있도록하려면 MySQL을 구축 할 때 그 지원이 구성되어 있어야합니다. 이것이 적용되는지 여부는 서버의 도움말 출력을 체크하고 확인할 수 있습니다. 성능 스키마를 사용할 수있는 경우 출력에 performance_schema
로 시작하는 이름을 가진 여러 변수가 표시됩니다.
shell> mysqld --verbose --help
...
--performance_schema
Enable the performance schema.
--performance_schema_events_waits_history_long_size=#
Number of rows in events_waits_history_long.
...
그런 변수가 출력에 표시되지 않는 경우, 서버는 성능 스키마를 지원하도록 구축되어 있지 않습니다. 이 경우, 섹션 22.2 "성능 스키마 구성" 을 참조하십시오.
성능 스키마를 사용할 수있는 것으로, MySQL 5.6.6 이후 그것은 기본적으로 활성화됩니다. 5.6.6 이전에는, 그것은 기본적으로 비활성화됩니다. 그것을 명시 적으로 활성화 또는 비활성화하려면 performance_schema
변수를 적절한 값으로 설정하여 서버를 시작합니다. 예를 들어, my.cnf
파일에 다음 줄을 사용합니다.
[mysqld] performance_schema=ON
서버는 시작할 때 performance_schema
을 확인하고 성능 스키마의 초기화를 시도합니다. 초기화의 성공을 확인하려면이 문을 사용합니다.
mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| performance_schema | ON |
+--------------------+-------+
ON
값은 성능 스키마가 제대로 초기화되어 사용할 준비가되어 있다는 것을 의미합니다. OFF
의 값은 어떠한 에러가 발생하는 것을 의미합니다. 무엇에 이상이 발생했는지에 대한 정보는 서버 오류 로그를 확인하십시오.
성능 스키마는 스토리지 엔진으로 구현됩니다. 이 엔진을 사용할 수있는 경우 (먼저 이미 체크하고있는 것입니다) INFORMATION_SCHEMA.ENGINES
테이블 또는 SHOW ENGINES
명령문의 출력에 SUPPORT
값이 YES
로 그것이 표시되어있는 것으로 알 수 있습니다.
mysql>SELECT * FROM INFORMATION_SCHEMA.ENGINES
->WHERE ENGINE='PERFORMANCE_SCHEMA'\G
*************************** 1. row *************************** ENGINE: PERFORMANCE_SCHEMA SUPPORT: YES COMMENT: Performance Schema TRANSACTIONS: NO XA: NO SAVEPOINTS: NO mysql>SHOW ENGINES\G
... Engine: PERFORMANCE_SCHEMA Support: YES Comment: Performance Schema Transactions: NO XA: NO Savepoints: NO ...
PERFORMANCE_SCHEMA
스토리지 엔진은 performance_schema
데이터베이스의 테이블을 조작합니다. 그 테이블에 대한 참조를 데이터베이스 이름으로 한정 할 필요가 없도록 performance_schema
를 기본 데이터베이스로 할 수 있습니다.
mysql> USE performance_schema;
이 장의 많은 예는 performance_schema
가 기본 데이터베이스라고합니다.
성능 스키마 테이블 performance_schema
데이터베이스에 저장됩니다. 이 데이터베이스 및 테이블 구조에 대한 정보를 얻으려면 다른 모든 데이터베이스처럼 INFORMATION_SCHEMA
데이터베이스에서 선택하거나 SHOW
문을 사용합니다. 예를 들어, 어떤 성능 스키마 테이블이 존재하는지 확인하려면 이러한 문 중 하나를 사용합니다.
mysql>SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
->WHERE TABLE_SCHEMA = 'performance_schema';
+----------------------------------------------------+ | TABLE_NAME | +----------------------------------------------------+ | accounts | | cond_instances | | events_stages_current | | events_stages_history | | events_stages_history_long | | events_stages_summary_by_account_by_event_name | | events_stages_summary_by_host_by_event_name | | events_stages_summary_by_thread_by_event_name | | events_stages_summary_by_user_by_event_name | | events_stages_summary_global_by_event_name | | events_statements_current | | events_statements_history | | events_statements_history_long | ... | file_instances | | file_summary_by_event_name | | file_summary_by_instance | | host_cache | | hosts | | mutex_instances | | objects_summary_global_by_type | | performance_timers | | rwlock_instances | | session_account_connect_attrs | | session_connect_attrs | | setup_actors | | setup_consumers | | setup_instruments | | setup_objects | | setup_timers | | socket_instances | | socket_summary_by_event_name | | socket_summary_by_instance | | table_io_waits_summary_by_index_usage | | table_io_waits_summary_by_table | | table_lock_waits_summary_by_table | | threads | | users | +----------------------------------------------------+ mysql>SHOW TABLES FROM performance_schema;
+----------------------------------------------------+ | Tables_in_performance_schema | +----------------------------------------------------+ | accounts | | cond_instances | | events_stages_current | | events_stages_history | | events_stages_history_long | ...
성능 스키마 테이블의 수는 추가 계측의 구현이 진행되면서 시간에 따라 증가 할 것으로 예상됩니다.
performance_schema
데이터베이스의 이름은 소문자로 그 안에 테이블의 이름도 마찬가지입니다. 쿼리는 이름을 소문자로 입력하십시오.
각 테이블의 구조를 표시하려면 SHOW CREATE TABLE
을 사용합니다.
mysql> SHOW CREATE TABLE setup_timers\G
*************************** 1. row ***************************
Table: setup_timers
Create Table: CREATE TABLE `setup_timers` (
`NAME` varchar(64) NOT NULL,
`TIMER_NAME` enum('CYCLE','NANOSECOND','MICROSECOND','MILLISECOND','TICK')
NOT NULL
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8
테이블 구조는 INFORMATION_SCHEMA.COLUMNS
등의 테이블에서 선택하거나 SHOW COLUMNS
등의 문을 사용하여 얻을 수 있습니다.
performance_schema
데이터베이스의 테이블은 그들 사이의 정보의 종류 (현재 이벤트, 이벤트 기록 및 요약 개체 인스턴스 및 설치 (구성) 정보)에 따라 그룹화 할 수 있습니다. 다음 예제에서는 이러한 테이블의 몇 가지 사용 방법을 보여줍니다. 각 그룹의 테이블에 대한 자세한 내용은 섹션 22.9 "성능 스키마 테이블의 설명" 을 참조하십시오.
첫째, 모든 instrument와 소비자가 활성화되어 있지 않기 때문에 성능 스키마는 모든 이벤트를 수집하지 않습니다. 이 모든 것을 선택하고 이벤트 타이밍을 활성화하려면 2 개의 문을 실행합니다 (행 개수는 MySQL 버전에 따라 다를 수 있습니다).
mysql>UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES';
Query OK, 338 rows affected (0.12 sec) mysql>UPDATE setup_consumers SET ENABLED = 'YES';
Query OK, 8 rows affected (0.00 sec)
현재 서버가 무엇을하고 있는지 확인하려면 events_waits_current
테이블을 조사합니다. 그것에는 스레드마다 각 스레드의 최신 모니터 된 이벤트를 나타내는 하나의 행이 포함됩니다.
mysql> SELECT * FROM events_waits_current\G
*************************** 1. row ***************************
THREAD_ID: 0
EVENT_ID: 5523
EVENT_NAME: wait/synch/mutex/mysys/THR_LOCK::mutex
SOURCE: thr_lock.c:525
TIMER_START: 201660494489586
TIMER_END: 201660494576112
TIMER_WAIT: 86526
SPINS: NULL
OBJECT_SCHEMA: NULL
OBJECT_NAME: NULL
OBJECT_TYPE: NULL
OBJECT_INSTANCE_BEGIN: 142270668
NESTING_EVENT_ID: NULL
OPERATION: lock
NUMBER_OF_BYTES: NULL
FLAGS: 0
...
이 이벤트는 스레드 0이 THR_LOCK::mutex
잠금, mysys
서브 시스템의 상호 배타 락을 획득하기 위해 86,526 피코 초 대기하고 있었다는 것을 보여줍니다. 처음 몇 열은 다음 정보를 제공합니다.
ID 열은 이벤트의 발생원의 thread와 이벤트 번호를 나타냅니다.
EVENT_NAME
은 instrument 된 것을 나타내고SOURCE
는 instrument 된 코드를 포함하는 소스 파일을 보여줍니다.타이머 컬럼은 이벤트가 시작 및 중지시기 및 이에 소요 된 시간을 나타냅니다. 이벤트가 아직 진행중인 경우
TIMER_END
과TIMER_WAIT
값이NULL
입니다. 타이머 값은 개산에서 피코 초에 표시됩니다. 타이머 및 이벤트 시간 컬렉션은 섹션 22.2.3.1 "성능 스키마 이벤트 타이밍" 을 참조하십시오.
기록 테이블에는 현재 이벤트 테이블과 같은 종류의 줄이 포함되지만 다른 줄도 서버가 "현재"가 아니라 "최근"무엇을 수행하고 있었는지가 표시됩니다. events_waits_history
및 events_waits_history_long
테이블에는 스레드마다 최신 10 이벤트와 최신 10,000 이벤트가 각각 포함되어 있습니다. 예를 들어, 스레드 13에 의해 생성 된 최신 이벤트 정보를 표시하려면 다음을 수행합니다.
mysql>SELECT EVENT_ID, EVENT_NAME, TIMER_WAIT
->FROM events_waits_history WHERE THREAD_ID = 13
->ORDER BY EVENT_ID;
+----------+-----------------------------------------+------------+ | EVENT_ID | EVENT_NAME | TIMER_WAIT | +----------+-----------------------------------------+------------+ | 86 | wait/synch/mutex/mysys/THR_LOCK::mutex | 686322 | | 87 | wait/synch/mutex/mysys/THR_LOCK_malloc | 320535 | | 88 | wait/synch/mutex/mysys/THR_LOCK_malloc | 339390 | | 89 | wait/synch/mutex/mysys/THR_LOCK_malloc | 377100 | | 90 | wait/synch/mutex/sql/LOCK_plugin | 614673 | | 91 | wait/synch/mutex/sql/LOCK_open | 659925 | | 92 | wait/synch/mutex/sql/THD::LOCK_thd_data | 494001 | | 93 | wait/synch/mutex/mysys/THR_LOCK_malloc | 222489 | | 94 | wait/synch/mutex/mysys/THR_LOCK_malloc | 214947 | | 95 | wait/synch/mutex/mysys/LOCK_alarm | 312993 | +----------+-----------------------------------------+------------+
기록 테이블에 새로운 이벤트가 추가되면 테이블이 가득이면 오래된 이벤트가 삭제됩니다.
요약 테이블은 시간이 지남에 모든 이벤트에 대해 집계 된 정보를 제공합니다. 이 그룹의 테이블은 다양한 방법으로 이벤트 데이터가 요약됩니다. 가장 많은 횟수 실행되었는지, 또는 가장 대기 시간이 걸렸다 instrument를 확인하려면 COUNT_STAR
또는 SUM_TIMER_WAIT
컬럼에서 events_waits_summary_global_by_event_name
테이블을 정렬합니다. 이 컬럼은 모든 이벤트에 걸쳐 계산 된 COUNT(*)
또는 SUM(TIMER_WAIT)
값에 해당합니다.
mysql>SELECT EVENT_NAME, COUNT_STAR
->FROM events_waits_summary_global_by_event_name
->ORDER BY COUNT_STAR DESC LIMIT 10;
+---------------------------------------------------+------------+ | EVENT_NAME | COUNT_STAR | +---------------------------------------------------+------------+ | wait/synch/mutex/mysys/THR_LOCK_malloc | 6419 | | wait/io/file/sql/FRM | 452 | | wait/synch/mutex/sql/LOCK_plugin | 337 | | wait/synch/mutex/mysys/THR_LOCK_open | 187 | | wait/synch/mutex/mysys/LOCK_alarm | 147 | | wait/synch/mutex/sql/THD::LOCK_thd_data | 115 | | wait/io/file/myisam/kfile | 102 | | wait/synch/mutex/sql/LOCK_global_system_variables | 89 | | wait/synch/mutex/mysys/THR_LOCK::mutex | 89 | | wait/synch/mutex/sql/LOCK_open | 88 | +---------------------------------------------------+------------+ mysql>SELECT EVENT_NAME, SUM_TIMER_WAIT
->FROM events_waits_summary_global_by_event_name
->ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
+----------------------------------------+----------------+ | EVENT_NAME | SUM_TIMER_WAIT | +----------------------------------------+----------------+ | wait/io/file/sql/MYSQL_LOG | 1599816582 | | wait/synch/mutex/mysys/THR_LOCK_malloc | 1530083250 | | wait/io/file/sql/binlog_index | 1385291934 | | wait/io/file/sql/FRM | 1292823243 | | wait/io/file/myisam/kfile | 411193611 | | wait/io/file/myisam/dfile | 322401645 | | wait/synch/mutex/mysys/LOCK_alarm | 145126935 | | wait/io/file/sql/casetest | 104324715 | | wait/synch/mutex/sql/LOCK_plugin | 86027823 | | wait/io/file/sql/pid | 72591750 | +----------------------------------------+----------------+
이러한 결과는 THR_LOCK_malloc
상호 배타적 잠금이 그 사용 빈도와 스레드가 그것을 획득하려고 대기하는 시간의 양 모두에 대해 "핫"임을 나타냅니다.
THR_LOCK_malloc
상호 배타 락은 디버그 빌드에서만 사용됩니다. 실전 빌드는 존재하지 않기 때문에 뜨거운 없습니다.
인스턴스 테이블은 instrument 된 객체의 종류를 설명합니다. instrument 된 객체는 서버에서 사용하는 이벤트를 생성합니다. 이 테이블은 이벤트 이름과 설명 메모 또는 상태 정보를 제공합니다. 예를 들어, file_instances
테이블은 파일 I / O 작업의 instrument 인스턴스와 그와 관련된 파일을 나열합니다.
mysql> SELECT * FROM file_instances\G
*************************** 1. row ***************************
FILE_NAME: /opt/mysql-log/60500/binlog.000007
EVENT_NAME: wait/io/file/sql/binlog
OPEN_COUNT: 0
*************************** 2. row ***************************
FILE_NAME: /opt/mysql/60500/data/mysql/tables_priv.MYI
EVENT_NAME: wait/io/file/myisam/kfile
OPEN_COUNT: 1
*************************** 3. row ***************************
FILE_NAME: /opt/mysql/60500/data/mysql/columns_priv.MYI
EVENT_NAME: wait/io/file/myisam/kfile
OPEN_COUNT: 1
...
설정 테이블은 모니터링 특성 구성 및 표시하는 데 사용됩니다. 예를 들어, 선택되는 이벤트 타이머를 표시하려면 setup_timers
테이블을 쿼리합니다.
mysql> SELECT * FROM setup_timers;
+-----------+-------------+
| NAME | TIMER_NAME |
+-----------+-------------+
| idle | MICROSECOND |
| wait | CYCLE |
| stage | NANOSECOND |
| statement | NANOSECOND |
+-----------+-------------+
setup_instruments
이벤트를 수집 할 수있는 일련의 instrument를 나열하고 그 중 어느 것이 활성화되어 있는지를 나타냅니다.
mysql> SELECT * FROM setup_instruments;
+------------------------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+------------------------------------------------------------+---------+-------+
...
| wait/synch/mutex/sql/LOCK_global_read_lock | YES | YES |
| wait/synch/mutex/sql/LOCK_global_system_variables | YES | YES |
| wait/synch/mutex/sql/LOCK_lock_db | YES | YES |
| wait/synch/mutex/sql/LOCK_manager | YES | YES |
...
| wait/synch/rwlock/sql/LOCK_grant | YES | YES |
| wait/synch/rwlock/sql/LOGGER::LOCK_logger | YES | YES |
| wait/synch/rwlock/sql/LOCK_sys_init_connect | YES | YES |
| wait/synch/rwlock/sql/LOCK_sys_init_slave | YES | YES |
...
| wait/io/file/sql/binlog | YES | YES |
| wait/io/file/sql/binlog_index | YES | YES |
| wait/io/file/sql/casetest | YES | YES |
| wait/io/file/sql/dbopt | YES | YES |
...
instrument 이름의 해석 방법을 이해하려면 섹션 22.4 "성능 스키마 instrument 명명 규칙" 을 참조하십시오.
instrument의 이벤트를 수집할지 여부를 제어하려면 그 ENABLED
값을 YES
또는 NO
로 설정합니다. 예 :
mysql>UPDATE setup_instruments SET ENABLED = 'NO'
->WHERE NAME = 'wait/synch/mutex/sql/LOCK_mysql_create_db';
성능 스키마는 수집 된 이벤트를 사용하여 이벤트 정보 "소비자"역할을 performance_schema
데이터베이스의 테이블을 업데이트합니다. setup_consumers
테이블은 사용 가능한 소비자와 어느 것이 활성화되어 있는지를 나타냅니다.
mysql> SELECT * FROM setup_consumers;
+--------------------------------+---------+
| NAME | ENABLED |
+--------------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | NO |
| events_statements_history_long | NO |
| events_waits_current | NO |
| events_waits_history | NO |
| events_waits_history_long | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+--------------------------------+---------+
성능 스키마가 소비자를 이벤트 정보의 대상으로 보수 여부를 제어하려면 그 ENABLED
값을 설정합니다.
설정 테이블에 대해 때 그들을 사용하여 이벤트 수집을 제어하는 자세한 내용은 섹션 22.2.3.2 "성능 스키마 이벤트 필터링" 을 참조하십시오.
앞서 그룹의 어느 것에도 속하지 않는 기타 테이블이 몇 가지 있습니다. 예를 들어, performance_timers
는 사용 가능한 이벤트 타이머와 그 특성을 나열합니다. 타이머에 대한 자세한 내용은 섹션 22.2.3.1 "성능 스키마 이벤트 타이밍" 을 참조하십시오.