42
Alexander Rubin Principal Architect, Percona Using Performance Schema to Monitor and Troubleshoot MySQL 5.6

Using Performance Schema to Monitor and … · Using Performance Schema to Monitor and Troubleshoot ... SELECT * FROM orders WHERE ... bm-cloud-db01-02 sys> select * from processlist

Embed Size (px)

Citation preview

Alexander Rubin Principal Architect, Percona

Using Performance Schema to Monitor and Troubleshoot MySQL 5.6

www.percona.com 2

About me

• Working with MySQL for over 10 years

• Started at MySQL AB, then Sun

Microsystems,

• then Oracle (MySQL Consulting)

• Joined Percona 1 year ago

• Helping customers improve MySQL performance

• performance tuning

• full text search

• high availability

My name is Alexander Rubin

www.percona.com 3

Agenda

• Introduction to Performance Schema

• In MySQL 5.6

• Examples of using MySQL Performance

Schema

• Performance Schema configuration

www.percona.com 4

Performance Analyses

• Before MySQL 5.6 P_S:

• STATUS variables (SESSION and GLOBAL)

• Counters since MySQL start

• SHOW ENGINE INNODB STATUS

• SHOW PROFILES

• MySQL Slow Query Log

• Additional details in Percona Server

www.percona.com 5

Multi-tenant MySQL server

• With MySQL 5.6 you can get:

• Per user statistics • i.e. “charge per IOPS”

• Per schema statistics • Most used schema/db?

• Per table statistics • Top “hottest” tables (io, requests, etc)

www.percona.com 6

PERFORMANCE_SCHEMA

• If you run MySQL 5.6 (>5.6.6) it is there!

bm-cloud-db01-02 sys> show global variables like

'performance_schema';

+--------------------+-------+

| Variable_name | Value |

+--------------------+-------+

| performance_schema | ON |

+--------------------+-------+

1 row in set (0.00 sec)

www.percona.com 7

PERFORMANCE_SCHEMA

• events_statements_summary_by

_digest table

• All query “patterns”

• Not a slow query log

• No query examples

• Normalized version of the

query

www.percona.com 8

PERFORMANCE_SCHEMA

mysql> select DIGEST_TEXT from performance_schema.events_statements_summary_by_digest; *************************** DIGEST_TEXT: SELECT * FROM orders WHERE customer_id = ? AND quantity > ?

www.percona.com 9

Performance Schema Tables

• 52 tables in performance_schema • No views shipped with server

• Mix of configuration tables and data tables: • Configuration Tables • Object Tables • Current Tables • History Tables • Summary Tables • Other Tables…

www.percona.com 10

SYS schema (PS_Helper)

A great tool by Mark Leith to make

PERFORMANCE_SCHEMA easier to use

https://github.com/MarkLeith/mysql-sys

$ mysql -u root -p < ./sys_56.sql

www.percona.com 11

SYS schema (PS_Helper) +-----------------------------------------------+ | Tables_in_sys | +-----------------------------------------------+ | innodb_buffer_stats_by_schema | | innodb_buffer_stats_by_table | | io_by_thread_by_latency | | io_global_by_file_by_bytes | | io_global_by_file_by_latency | | io_global_by_wait_by_bytes | | io_global_by_wait_by_latency | | latest_file_io | | processlist | | ps_check_lost_instrumentation | | schema_index_statistics | | schema_object_overview | | schema_table_statistics | | schema_table_statistics_with_buffer | | schema_tables_with_full_table_scans | | schema_unused_indexes | | statement_analysis | | statements_with_errors_or_warnings | | statements_with_full_table_scans | | statements_with_runtimes_in_95th_percentile | | statements_with_sorting | | statements_with_temp_tables | | user_summary |

www.percona.com 12

Examples

• Real server example

Backend MySQL server for

cloud.percona.com

• MySQL server: bm-cloud-db01-02

www.percona.com 13

User Level

Statistics

www.percona.com 14

User: charge per IOS

bm-cloud-db01-02 sys> select * from user_summary_by_file_io where user like 'a%'; +-------+------------+-------------+ | user | ios | io_latency | +-------+------------+-------------+ | api01 | 3061469563 | 4.04h | | api03 | 912296937 | 1.36h | | api02 | 815473183 | 1.22h | | app01 | 9704381 | 00:01:06.33 | | app02 | 1160149 | 8.18 s | | app03 | 1424065 | 7.23 s | +-------+------------+-------------+ 6 rows in set (0.06 sec)

www.percona.com 15

SELECT Queries per User (1)

bm-cloud-db01-02 sys>

select user, statement, total, total_latency, max_latency, max_latency

from user_summary_by_statement_type

where statement = 'select' and user like 'a%' limit 100;

+-------+-----------+-----------+---------------+-------------+-------------+

| user | statement | total | total_latency | max_latency | max_latency |

+-------+-----------+-----------+---------------+-------------+-------------+

| api01 | select | 476124349 | 14.41h | 2.84 s | 2.84 s |

| api02 | select | 244682 | 15.41 s | 114.25 ms | 114.25 ms |

| api03 | select | 245577 | 18.32 s | 712.31 ms | 712.31 ms |

| app01 | select | 946423 | 00:15:17.56 | 5.97 s | 5.97 s |

| app02 | select | 605048 | 00:19:36.20 | 41.10 s | 41.10 s |

| app03 | select | 605751 | 00:21:17.51 | 00:01:29.79 | 00:01:29.79 |

+-------+-----------+-----------+---------------+-------------+-------------+

6 rows in set (0.04 sec)

www.percona.com 16

SELECT Queries per User (2)

bm-cloud-db01-02 sys>

select user, statement, total, rows_sent, rows_examined, rows_affected, full_scans from

user_summary_by_statement_type

where statement = 'select' and user like 'a%' limit 100; +-------+-----------+-----------+-----------+---------------+---------------+------------+

| user | statement | total | rows_sent | rows_examined | rows_affected | full_scans |

+-------+-----------+-----------+-----------+---------------+---------------+------------+

| api01 | select | 476127228 | 761034375 | 1067358269 | 0 | 0 |

| api02 | select | 244684 | 250189 | 42136 | 0 | 1015 |

| api03 | select | 245583 | 249758 | 481981 | 0 | 1026 |

| app01 | select | 946427 | 6631901 | 675604558 | 0 | 46748 |

| app02 | select | 605073 | 1415686 | 766008144 | 0 | 40791 |

| app03 | select | 605812 | 1469438 | 801697771 | 0 | 40654 |

+-------+-----------+-----------+-----------+---------------+---------------+------------+

6 rows in set (0.04 sec)

www.percona.com 17

UPDATE Queries per User (3)

bm-cloud-db01-02 sys> select user, statement, total, rows_sent, rows_examined, rows_affected,

full_scans

-> from user_summary_by_statement_type

-> where statement = 'update' and user like 'a%' limit 100;

+-------+-----------+-----------+-----------+----------------------+---------------+------------+

| user | statement | total | rows_sent | rows_examined | rows_affected | full_scans |

+-------+-----------+-----------+-----------+----------------------+---------------+------------+

| api01 | update | 142895753 | 0 | 142895760 | 141977389 | 0 |

| app01 | update | 6572 | 0 | 110386091 | 7188 | 0 |

| app02 | update | 2842 | 0 | 2842 | 2839 | 0 |

| app03 | update | 2908 | 0 | 2908 | 2907 | 0 |

+-------+-----------+-----------+-----------+----------------------+---------------+------------+

4 rows in set (0.05 sec)

www.percona.com 18

What have been user up to?

bm-cloud-db01-02 sys> select user, statement, total, rows_sent, rows_examined,

rows_affected, full_scans from user_summary_by_statement_type where user =

'api01' limit 100; +-------+-------------+-----------+-----------+---------------+---------------+------------+

| user | statement | total | rows_sent | rows_examined | rows_affected | full_scans |

+-------+-------------+-----------+-----------+---------------+---------------+------------+

| api01 | insert | 368405774 | 0 | 0 | 494179199 | 0 |

| api01 | commit | 376276686 | 0 | 0 | 0 | 0 |

| api01 | select | 476129532 | 761038004 | 1067363348 | 0 | 0 |

| api01 | update | 142896430 | 0 | 142896437 | 141978066 | 0 |

| api01 | begin | 376280424 | 0 | 0 | 0 | 0 |

| api01 | show_fields | 2215016 | 310102240 | 310102240 | 0 | 2215016 |

| api01 | Quit | 73421361 | 0 | 0 | 0 | 0 |

| api01 | change_db | 17258767 | 0 | 0 | 0 | 0 |

| api01 | delete | 7896 | 0 | 7896 | 7896 | 0 |

| api01 | rollback | 3711 | 0 | 0 | 0 | 0 |

+-------+-------------+-----------+-----------+---------------+---------------+------------+

10 rows in set (0.04 sec)

www.percona.com 19

Examples

Query Level

Statistics

www.percona.com 20

Most frequent query

bm-cloud-db01-02 sys> select * from statement_analysis where query is not NULL and

query <> 'COMMIT' order by exec_count desc limit 1 \G

*************************** 1. row ***************************

query: INSERT INTO `query_class_metri ...

db: o454 full_scan:

exec_count: 29557364

err_count: 0

warn_count: 840053

total_latency: 31.02h max_latency: 613.70 ms

avg_latency: 3.78 ms

lock_latency: 27.01h

first_seen: 2014-03-28 19:51:10

last_seen: 2014-05-12 23:51:12

rows_sent: 0

rows_sent_avg: 0 rows_examined: 0 rows_examined_avg: 0

tmp_tables: 0 tmp_disk_tables: 0

rows_sorted: 0 sort_merge_passes: 0

www.percona.com 21

TEMP TABLES

bm-cloud-db01-02 sys> select * from statements_with_temp_tables where query like

'%select%' order by exec_count desc limit 1 \G

*************************** 1. row ***************************

query: SELECT MAX ( COALESCE ( `p` . ... BY `idle_in_trx` DESC LIMIT

? db: NULL

exec_count: 196705

total_latency: 00:03:33.18

memory_tmp_tables: 983525

disk_tmp_tables: 196705 avg_tmp_tables_per_query: 5

tmp_tables_to_disk_pct: 20

first_seen: 2014-03-28 19:51:20

last_seen: 2014-06-05 16:31:13

digest: d5ad70335d1b1f7ea31f61844714c5fe

www.percona.com 22

SORTING

bm-cloud-db02-02 sys> select * from statements_with_sorting where query is not null

order by exec_count desc limit 1 \G

*************************** 1. row ***************************

query: SELECT ... r ORDER BY SYSTEM_USER , HOST

db: NULL exec_count: 36

total_latency: 6.45 ms

sort_merge_passes: 0

avg_sort_merges: 0

sorts_using_scans: 36 sort_using_range: 0

rows_sorted: 1548

avg_rows_sorted: 43

first_seen: 2014-06-04 07:10:02

last_seen: 2014-06-05 16:09:58 digest: f10db7e5065d146b001702352ad48e56

www.percona.com 23

Better PROCESSLIST (Master)

bm-cloud-db01-02 sys> select * from processlist where command <> 'Sleep' and db is

not NULL limit 10 \G *************************** 1. row ***************************

thd_id: 76967883

conn_id: 76967831

user: [email protected]

db: o802

command: Query state: init

time: 0

current_statement: INSERT INTO metric_data ...

lock_latency: 1.40 ms

rows_examined: 0 rows_sent: 0

rows_affected: 0

tmp_tables: 0

tmp_disk_tables: 0

full_scan: NO

www.percona.com 24

Better PROCESSLIST (Slave)

bm-cloud-db02-02 sys> select * from processlist where command <> 'Sleep' limit 10 \G *************************** 1. row ***************************

thd_id: 581849

conn_id: 581797

user: [email protected]

db: o1

command: Execute state: NULL

time: 6

current_statement: SELECT ts, service, level, msg ... C..

lock_latency: 0 ps

rows_examined: 0 rows_sent: 0

rows_affected: 0

tmp_tables: 0

tmp_disk_tables: 0

full_scan: NO

www.percona.com 25

Examples

Table /Schema

Level Statistics

www.percona.com 26

TABLE_STATISTICS

mysql [localhost] {msandbox} > select * from schema_table_statistics where table_schema='sbtest' limit 1 \G *************************** 1. row *************************** table_schema: sbtest table_name: sbtest rows_fetched: 158764154 fetch_latency: 1.37h rows_inserted: 378901 insert_latency: 00:07:17.38 rows_updated: 1136714 update_latency: 00:45:40.08 rows_deleted: 378902 delete_latency: 00:03:00.34 io_read_requests: 636003 io_read: 9.70 GiB io_read_latency: 00:28:12.01 io_write_requests: 203925 io_write: 3.11 GiB io_write_latency: 17.26 s io_misc_requests: 2449 io_misc_latency: 3.87 s

www.percona.com 27

..with Buffer Pool Information

mysql [localhost] {msandbox} > select * from schema_table_statistics_with_buffer where

table_schema='sbtest' limit 1 \G *************************** 1. row *************************** table_schema: sbtest

table_name: sbtest rows_fetched: 152462125

fetch_latency: 1.31h rows_inserted: 363850 insert_latency: 00:06:59.73

rows_updated: 1091562 update_latency: 00:43:51.35

rows_deleted: 363852 delete_latency: 00:02:53.92 ….

innodb_buffer_allocated: 110.41 MiB innodb_buffer_data: 97.63 MiB

innodb_buffer_pages: 7066 innodb_buffer_pages_hashed: 7066 innodb_buffer_pages_old: 7066

innodb_buffer_rows_cached: 593628 1 row in set (24.82 sec)

www.percona.com 28

Index Usage: unused_indexes

bm-cloud-db01-02 sys> select * from schema_unused_indexes where object_schema

<> 'mysql' and index_name <> 'PRIMARY' limit 10;

+---------------+-------------------------+-----------------+

| object_schema | object_name | index_name |

+---------------+-------------------------+-----------------+ | o1 | agent_log | agent_id |

| o1 | qh_view_query_classes | qh_view_id |

| o10 | agent_log_entries | agent_entry_idx |

| o10 | qh_views | name |

| o10 | qh_view_overview_agents | qh_view_id | | o10 | qh_view_query_classes | qh_view_id |

| o10 | query_classes | attribute |

| o10 | query_class_metrics | agent_class_ts |

| o10 | query_class_metrics | agent_ts |

| o10 | query_comments | query_class_id | +---------------+-------------------------+-----------------+

10 rows in set (3.18 sec)

www.percona.com 29

Latest File IO

mysql [localhost] {msandbox} > select * from latest_file_io limit 1 \G *************************** 1. row ***************************

file: @@datadir/sbtest/sbtest.ibd

count_read: 1535779

total_read: 23.43 GiB

avg_read: 16.00 KiB

count_write: 461491

total_written: 7.05 GiB

avg_written: 16.01 KiB

total: 30.48 GiB

write_pct: 23.12

1 row in set (0.00 sec)

• events_waits_history_long needs to be enabled

www.percona.com 30

Hot Tables

bm-cloud-db01-02 sys> select * from io_global_by_file_by_bytes

where file like '%.ibd' limit 10\G *************************** 1. row *************************** file: @@datadir/pct_stats/agent_daily.ibd

count_read: 57 total_read: 912.00 KiB

avg_read: 16.00 KiB count_write: 1010672 total_written: 15.42 GiB

avg_write: 16.00 KiB total: 15.42 GiB

write_pct: 99.99 *************************** 2. row *************************** file: @@datadir/pct/agents.ibd

count_read: 22 total_read: 352.00 KiB

avg_read: 16.00 KiB count_write: 701695 total_written: 10.71 GiB

avg_write: 16.00 KiB total: 10.71 GiB

write_pct: 100.00

www.percona.com 31

Hot Schemas

bm-cloud-db01-02 sys> select SUBSTRING_INDEX(SUBSTRING_INDEX( file

, '/', 5 ), '/', -1) AS d, format_bytes(sum(total)) as bytes

from x$io_global_by_file_by_bytes

where file like '%.ibd'

group by d order by sum(total) desc limit 10;

+---------------+------------+

| d | bytes |

+---------------+------------+

| pct_stats | 15.64 GiB |

| pct | 11.08 GiB |

| percona | 1.66 GiB |

| pct_perf | 21.03 MiB |

| mysql | 9.67 MiB |

| version_check | 944.00 KiB |

+---------------+------------+

www.percona.com 32

Configuration

P_S Configuration

www.percona.com 33

Instruments and Consumers

• Can be configured at startup in MySQL

5.6

• --performance-schema-

instrument='wait/synch/cond/%=cou

nted‘

• --performance-schema-consumer-

events-waits-history=on

www.percona.com 34

Instruments

• Can be enabled through SQL

• Changes lost on restart

• Use –init-file=ps.sql for configuration

• Can enable counting and timing

bm-cloud-db01-02 performance_schema> select * from setup_instruments where name like "%file%" limit

10; +------------------------------------------------+---------+-------+ | NAME | ENABLED | TIMED |

+------------------------------------------------+---------+-------+ | wait/synch/mutex/sql/LOCK_des_key_file | NO | NO |

| wait/synch/mutex/innodb/file_format_max_mutex | NO | NO | | wait/synch/mutex/innodb/srv_dict_tmpfile_mutex | NO | NO | | wait/synch/mutex/innodb/srv_misc_tmpfile_mutex | NO | NO |

| wait/synch/mutex/innodb/srv_monitor_file_mutex | NO | NO | | wait/io/file/sql/map | YES | YES |

| wait/io/file/sql/binlog | YES | YES | | wait/io/file/sql/binlog_index | YES | YES | | wait/io/file/sql/relaylog | YES | YES |

| wait/io/file/sql/relaylog_index | YES | YES | +------------------------------------------------+---------+-------+

www.percona.com 35

Configuring Threads

• Enable/disable instrumentation for any thread

• Both user and system THREAD_ID: 78002236

NAME: thread/sql/one_connection

TYPE: FOREGROUND

PROCESSLIST_ID: 78002184

PROCESSLIST_USER: api03

PROCESSLIST_HOST: xxx.xxx.xxx.xxx

PROCESSLIST_DB: o1479

PROCESSLIST_COMMAND: Execute

PROCESSLIST_TIME: 0

PROCESSLIST_STATE: init

PROCESSLIST_INFO: INSERT INTO ..metrics ...

PARENT_THREAD_ID: NULL

ROLE: NULL

INSTRUMENTED: YES

www.percona.com 36

Configuring “actors”

• By default all users from all hosts are

profiled

• We can change that as needed

bm-cloud-db01-02 performance_schema> select * from

setup_actors;

+------+------+------+

| HOST | USER | ROLE |

+------+------+------+ | % | % | % |

+------+------+------+

1 row in set (0.01 sec)

www.percona.com 37

Configuring Objects

• Object means Table for now

• Skips instrumentation

• Table IO

• Lock Information

bm-cloud-db01-02 performance_schema> select * from setup_objects;

+-------------+--------------------+-------------+---------+-------+ | OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED | +-------------+--------------------+-------------+---------+-------+

| TABLE | mysql | % | NO | NO | | TABLE | performance_schema | % | NO | NO |

| TABLE | information_schema | % | NO | NO | | TABLE | % | % | YES | YES | +-------------+--------------------+-------------+---------+-------+

4 rows in set (0.00 sec)

www.percona.com 38

Getting Incremental Data

• What have been top statements for last 5

minutes?

• Pull the data in the separate table and

compute the difference

• Use TRUNCATE TABLE to flush

statistics

www.percona.com 39

Overhead

• Can vary significantly on workload and configuration

• CPU bound, heavy on contention – worse overhead

• Mark Callaghan results

• http://bugs.mysql.com/bug.php?id=68413

• 3% overhead for having PS compiled in

• 11% overhead with default settings

• Peter Z results (sysbench read only)

• 10% overhead PS OFF->ON

• 24% overhead PS OFF-> ALL ON

• Recognize the gains as well!

www.percona.com 40

Enable ALL (on dev)

• My.cnf:

performance_schema_events_waits_history_long_size = 1000000

performance_schema_events_statements_history_long_size = 1000000

performance_schema_events_stages_history_long_size = 1000000

performance-schema-instrument='%=on'

• Enable all consumers

mysql> update setup_consumers set ENABLED = 'YES';

• Set all timer consistent to NANOSECOND

mysql> update setup_timers set TIMER_NAME =

'NANOSECOND';

www.percona.com 41

More on PERFORMANCE_SCHEMA

• MySQL Manual on Performance Schema • http://bit.ly/Uc7GIO

• Marc Alff’s Blog • http://marcalff.blogspot.com/

• Mark Leith’s Blog • http://www.markleith.co.uk/

• Presentations • MySQL Connect 2012

• http://bit.ly/142DuIa • Percona Live 2013

• http://bit.ly/12rZHwk

www.percona.com 42 www.percona.com

Thank You!