1. Performance 스키마 구성 : instrument, consumer

2. Instrument Elements

   1) statement/sql/select

       => statement instrument 타입이고 select에 정보를 수집

   2) wait/synch~~/autoinc_mutex 

       => wait instrument 타입이고, auto increment관련 mutex 정보 수집

   각 instrument에 대한 설명은 setup_instruments테이블에 documentation 항목 참조

  select * from performance_schema.setup_instruments

  where documentation is not null limit 10\G;

  NULL 항목이 많을 수 있으므로 해당 instrument에 이름과 추측을 통해 용도를 알 수 있음

3. Consumer : instrument에 정보를 가지고 있는 테이블

  1) *_current : 현재 서버에 발생하는 이벤트

  2) *_history : thread당 완료된 마지막 10개 이벤트

  3) *_history_long : globally하게 thread당 완료된 마지막 10,000개 이벤트

  events_wait : low-level server waits (예, muxtes)

  events_statements : SQL statements

  events_stages : profile info (ex, tempoary tables.)

  event_transactions : transactions

4. enable or disable performance schema

  performance_schema = ON or OFF ( my.cnf , restart )

 

  각 instrument enable/disable (아래 3가지 방법중 1개 선택해서 적용)

  1) setup_instruments 테이블 (1회성, restart시 초기화)

      update performance_schema.setup_instruments 

      set enabled='YES' where name='statement/sql/select'

  2) sys stored procedure (1회성, restart시 초기화)

      call sys.ps_setup_enable_instrument('statement/sql/select')

  3) startup options

      performance-schema-instrument='statement/sql/select=ON'

 

  각 consumers enable/disable

   1) setup_consumers 테이블 (1회성, restart시 초기화)

   2) sys stored procedure (1회성, restart시 초기화)

   3) startup options

       performance-schema-consumer=''

5. 모니터링

   1) 특정 Object 모니터링

       insert into performance_schema.setup_objects 

       (object_type, object_schema, object_name, enabled) 

       values ('TABLE', 't1', '%', 'YES');

   2) 특정 threads 모니터링

       update performance_schema.setup_threads set HISTORY='NO' 

       where NAME='thread/sql/event_scheduler';

       user에 대해 모니터링

       insert into performance_schema.setup_actors

       (HOST, USER, ENABLED, HISTORY)

       values ('127.0.0.1', 'test', 'YES', 'NO');

6.  Performance 스키마 사용

     1) SQL statement

        - 테이블 : events_statements_current, events_statements_history,

                        events_statements_history_long

        - 확인사항

          위에 테이블에 있은 컬럼중 아래 사항 확인

          created_tmp_disk_tables : disk base로 하는 table 생성이 증가하는지 체크.  

                                                         증가할 경우 memory temporary 사이즈를 증가

          select_full_join : join시 full table scan 하는지 체크. 적당한 인덱스 생성

          select_range_check : join에 적당한 인덱스가 없을 경우 확인작업 수행, 인덱스 생성필요

          sort_merge_passes : merge pass수 , 값이 증가하면 sort_buffer_size 증가 검토

          sort_scan : 테이블 스캔닝하면서 sort 하는 값 , 값이 증가하면 sql 튜닝 필요

          no_index_used : 쿼리에 index가 사용되지 않을 경우, 적당한 인덱스 생성

          no_good_index_used : 쿼리에 사용된 인덱스가 맞지 않을 경우, 적당한 인덱스 생성

 

          인덱스 사용되지 않거나, 맞지 않는 인덱스를 사용하는 쿼리 확인

          select thread_id, sql_text, rows_sent, rows_examined, created_tmp_tables, 

                     no_index_used, no_good_index_used

          from performance_schema.events_statements_history_long

          where no_index_used > 0 or no_good_index_used > 0;

 

          temporary tables를 생성하는 쿼리 확인

          select thread_id, sql_text, rows_sent, rows_examined, created_tmp_tables,

                      created_tmp_disk_tables

          from performance_schema.events_statements_history_long

          where created_tmp_tables > 0 or created_tmp_disk_tables > 0;

 

          결과값을 error return 하는 쿼리 확인

          select thread_id, sql_text, rows_sent, rows_examined, created_tmp_tables

          from performance_schema.events_statements_history_long

          where errors > 0;

 

          응답 시간이 5초 이상인 쿼리 확인

          select thread_id, sql_text, rows_sent, rows_examined, created_tmp_tables,

                     no_index_used, no_good_index_used

          from performance_schema.events_statements_history_long

          where timer_wait > 5000000000 ;

         

          sys database에서 확인 (performance에 view 제공)

          statement_analysis  : total 수행 시간으로 정렬된 statement 확인

          statements_with_errors_or_warnings : 에러나 warnings이 발생한 쿼리 확인

          statements_with_full_table_scan : full table scan를 하는 쿼리 확인

          statements_with_runtimes_in_95th_percentile : 평균 수행 시간이 상위 95%인 쿼리 확인

          statements_with_sorting : sort이 발생한 쿼리 확인

          statements_with_temp_tables : temporary tables를 사용한 쿼리 확인

 

   2) Database에 workload 확인 

         db가 read인지 write인지 확인하기 위해 아래 쿼리 수행

         select event_name, count(event_name) from events_statements_history_long

         group by event_name;

 

         query문에  latency 확인

         select event_name, count(event_name),

                     sum(lock_time/1000000) as latency_ms

         from events_statements_history

         group by event_name order by latency_ms desc;

 

         db에 rows read and write 양 확인

         with rows_read as (select sum(variable_value) as rows_read

         from global_status

         where variable_name in ('Handler_read_first', 'Handler_read_key', 'Handler_read_next',

         'Handler_read_last', 'Handler_read_prev', 'Handler_read_rnd, 'Handler_read_rnd_next')),

         rows_written as (select sum(variable_value) as rows_written from global_status 

         where variable_name in ('Handler_write'))

         select * from row_read, rows_written\G

 

         metalock 확인

         select processlist_id, object_type, lock_type, lock_status, source

         from metadata_locks join threads on (owner_thread_id = thread_id)

         where object_name = ' ' and object_name = ' ' \G

 

         memory 사용량 확인

         select event_name, 

                     current_number_of bytes_used/1024/1024 as current_mb,

                     high_number_of bytes_used/1024/1024 as high_mb,

         from performance_schema.memory_summary_global_by_event_name

         where event_name like 'memory/innodb/%'

         order by current_nubmer_of_bytes_used desc limit 10;

 

         select * from sys.memory_global_total;

 

         select thread_id, user, current_allocated, total_allocated

         from sys.memory_by_thread_by_current_bytes limit 9;

 

        사용자 thread 환경 대한 변수/값 확인

         select * from variables_by_thread where variable_name='tx_isolation';

 

         사용자 thread 통계 변수/값 확인

         select * from status_by_thread where variable_name = 'Handler_write';

 

         sql 수행시 에러가 발생하는 account

         select * from performance_schema.events_errors_summary_by_account_by_error

         where sum_error_raised > 10 and user is not null order by sum_error_raised desc\G;

 

         사용자 기준으로 메모리 사용량 확인

         select substring_index(event_name, '/', -1) as event,

                    current_number_of_bytes_used/1024/1024 as current_mb,

                    high_number_of_bytes_used/1024/1024 as high_mb

         from performance_schema.memory_summary_global_by_event_name

         where event_name like 'memory/performance_schema/%'

         order by current_number_of_bytes_used desc limit 10;

 

         select substring_index(event_name, '/', -1), current_alloc

         from sys.memory_global_by_current_bytes

         where event_name like 'memory/performance_schema/%'  limit 10;

 

         show engine performance_schema status\G;

 

 

 

'RDB > MySQL' 카테고리의 다른 글

mysql global status 증분값 확인  (1) 2023.01.29
서비스 SLA 시간  (0) 2023.01.28
Unused indexes 확인  (0) 2022.12.30
MySQL shell 특징 및 사용  (0) 2022.12.20
MySQL and Python 코드  (0) 2022.12.12

+ Recent posts