performance schema для отладки mysql приложений

62
<Insert Picture Here> Performance Schema для отладки MySQL приложений Sveta Smirnova Ведущий инженер технической поддержки MySQL

Upload: sveta-smirnova

Post on 16-Jun-2015

677 views

Category:

Technology


0 download

DESCRIPTION

Slides from Devconf 2013.

TRANSCRIPT

Page 1: Performance Schema для отладки MySQL приложений

<Insert Picture Here>

Performance Schema для отладки MySQL приложений

Sveta SmirnovaВедущий инженер технической поддержки MySQL

Page 2: Performance Schema для отладки MySQL приложений

Содержание

• История Performance Schema• Таблицы для DBA• Таблицы для разработчика• Другие таблицы• Инструменты• Производительность и тесты• Настройка• Где найти информацию• Итоги

Page 3: Performance Schema для отладки MySQL приложений

История Performance Schema

• Первая версия: 5.5• 17 таблиц• Полезна в основном для разработчиков MySQL• Инструменты для

– Mutex-ов– Блокировок

• Требует хорошего знания кода MySQL

Page 4: Performance Schema для отладки MySQL приложений

Типы таблиц

• Настройки– _setup– _instances

• События– events_waits_

• Дайджесты• История• Другие

Page 5: Performance Schema для отладки MySQL приложений

Версия 5.6 повернулась лицом к DBA

• Больше возможностей• 52 таблицы• Новые таблицы

предназначены для DBA• Знание MySQL кода

больше не необходимое условие

*Рассказываю как я рада нововведениям в Performance Schema, появившимся в версии 5.6 на конференции Devconf2012

*

Page 6: Performance Schema для отладки MySQL приложений

Таблицы для DBA

• events_statements_*• events_stages_*• Connection

Page 7: Performance Schema для отладки MySQL приложений

events_statements_*

• Запросы– statement/sql

• statement/sql/delete• statement/sql/select

• Команды– COM_PING, COM_QUIT, ...– statement/com

• statement/com/Ping• statement/com/Quit

• Ошибки– statement/sql/error– statement/com/Error

Page 8: Performance Schema для отладки MySQL приложений

events_statements_*: поиск ошибочных запросов

● mysql> select THREAD_ID, substr(SQL_TEXT, 1, 20),● MYSQL_ERRNO from  events_statements_history_long where ● MYSQL_ERRNO != 0;● +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+● | THREAD_ID | substr(SQL_TEXT, 1, 20) | MYSQL_ERRNO |● +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+● |        18 | select from * event_    |        1064 |● |        18 | select * from  event    |        1146 |● |        18 | select * from  event    |        1146 |● |        18 | select THREAD_ID, SQ    |        1146 |● +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+● 4 rows in set (0.00 sec)●

Page 9: Performance Schema для отладки MySQL приложений

events_statements_*: запросы, требующие оптимизации

● mysql> select THREAD_ID as TID, substr(SQL_TEXT, 1, 20) ● as SQL_TEXT, ROWS_SENT as RS, ROWS_EXAMINED as RE from  ● events_statements_history_long where ROWS_EXAMINED > ● ROWS_SENT * 10 limit 5;● +­­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­+­­­­­+● | TID | SQL_TEXT             | RS | RE  |● +­­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­+­­­­­+● |  18 | select THREAD_ID, SQ |  4 | 147 |● |  18 | select THREAD_ID, su |  4 | 148 |● |  18 | select THREAD_ID, su |  4 | 152 |● |  18 | select THREAD_ID, su |  4 | 153 |● |  18 | select THREAD_ID, su |  1 | 154 |● +­­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­+­­­­­+● 5 rows in set (0.00 sec)

Page 10: Performance Schema для отладки MySQL приложений

events_statements_*: что ещё посмотреть

• CREATED_TMP_DISK_TABLES• CREATED_TMP_TABLES• SELECT_FULL_JOIN • SELECT_RANGE_CHECK• SELECT_SCAN• SORT_MERGE_PASSES• SORT_SCAN• NO_INDEX_USED• NO_GOOD_INDEX_USED

Page 11: Performance Schema для отладки MySQL приложений

events_statements_*: ps_helper view

• http://www.markleith.co.uk/ps_helper/• View: statement_analysis• View: statements_with_runtimes_in_95th_percentile• View: statements_with_temp_tables• View: statements_with_sorting• View: statements_with_full_table_scans• View: statements_with_errors_or_warnings

Page 12: Performance Schema для отладки MySQL приложений

event_stages_*

• Та же информация, что и в поле State INFORMATION_SCHEMA.PROCESSLIST или SHOW PROCESSLIST– init– executing– Opening tables– ...

• Замена SHOW PROFILE• Только на уровне сервера• Информации от табличных движков в этой

таблице нет!

Page 13: Performance Schema для отладки MySQL приложений

event_stages_*: «Sending data» более 10 секунд

● mysql> select events_stages_history_long.event_name,● sql_text,  ● events_stages_history_long.timer_wait/1000000000000 ● wait_s from events_stages_history_long join ● events_statements_history_long on ● (events_stages_history_long.nesting_event_id = ● events_statements_history_long.event_id) where ● events_stages_history_long.EVENT_NAME like '%Sending ● data' and rows_sent < 10000000 and ● events_stages_history_long.timer_wait > 10*1000000000000 ● order by events_stages_history_long.timer_wait desc\G● ************************ 1. row ************************● event_name: stage/sql/Sending data●   sql_text: insert into test.t2 select * from test.t2 ●     wait_s: 243.5235● 1 rows in set (0.01 sec)●

Page 14: Performance Schema для отладки MySQL приложений

event_stages_*: другие потенциально медленные операции

• Все, относящиеся к временным таблицам– EVENT_NAME LIKE 'stage/sql/%tmp%'

• Все, относящиеся к блокировкам– EVENT_NAME LIKE 'stage/sql/%lock%'

• Все «Waiting for»– EVENT_NAME LIKE 'stage/%/Waiting for%'

• Часто встречающиеся проблемы (по опыту)– EVENT_NAME='stage/sql/end'– EVENT_NAME='stage/sql/freeing items'– EVENT_NAME='stage/sql/Sending data'– EVENT_NAME='stage/sql/cleaning up'– EVENT_NAME='stage/sql/closing tables'

Page 15: Performance Schema для отладки MySQL приложений

event_stages_*: выборка самых долгих

● mysql> select eshl.event_name, sql_text,● eshl.timer_wait/1000000000000 wait_s from ● events_stages_history_long eshl join ● events_statements_history_long esthl on ● (eshl.nesting_event_id = esthl.event_id) where ● eshl.timer_wait > 10*1000000000000\G● ************************ 1. row ************************● event_name: stage/sql/copy to tmp table●   sql_text: alter table t2 engine=innodb●     wait_s: 186.8122● ************************ 2. row ************************● event_name: stage/sql/Waiting for table metadata lock●   sql_text: insert into t2 select * from t2 LIMIT 10●     wait_s: 46.6250● 2 rows in set (0.01 sec)●

Page 16: Performance Schema для отладки MySQL приложений

event_stages_*: объединения

• NESTING_EVENT_ID– Statement– Wait– Stage

• EVENT_ID

events_statements

EVENT_ID

events_stages

NESTING_EVENT_ID

events_stages

NESTING_EVENT_ID

events_stages

NESTING_EVENT_ID

Page 17: Performance Schema для отладки MySQL приложений

Connection Tables: accounts

● mysql> select user, host, current_connections as cur, ● total_connections as total from accounts;● +­­­­­­+­­­­­­­­­­­+­­­­­+­­­­­­­+● | user | host      | cur | total |● +­­­­­­+­­­­­­­­­­­+­­­­­+­­­­­­­+● | foo  | localhost |   0 |     3 |● | root | localhost |   1 |     3 |● | NULL | NULL      |  14 |    17 |● +­­­­­­+­­­­­­­­­­­+­­­­­+­­­­­­­+● 3 rows in set (0.01 sec)●

Page 18: Performance Schema для отладки MySQL приложений

Connection Tables: users, hosts

● mysql> select user, current_connections as cur, ● total_connections as total from users;● +­­­­­­+­­­­­+­­­­­­­+● | user | cur | total |● +­­­­­­+­­­­­+­­­­­­­+● | root |   1 |     3 |● | NULL |  14 |    17 |● | foo  |   0 |     3 |● +­­­­­­+­­­­­+­­­­­­­+● 3 rows in set (0.00 sec)● mysql> select host, current_connections as cur, ● total_connections as total from hosts;● +­­­­­­­­­­­+­­­­­+­­­­­­­+● | host      | cur | total |● +­­­­­­­­­­­+­­­­­+­­­­­­­+● | NULL      |  14 |    17 |● | localhost |   1 |     6 |● +­­­­­­­­­­­+­­­­­+­­­­­­­+● 2 rows in set (0.01 sec)

Page 19: Performance Schema для отладки MySQL приложений

Connection Attribute Tables

● mysql_init(&mysql);● mysql_options(&mysql,MYSQL_OPT_CONNECT_ATTR_RESET, 0);●

● mysql_options4(&mysql,MYSQL_OPT_CONNECT_ATTR_ADD,●  "program", "Devconf2013");● mysql_options4(&mysql,MYSQL_OPT_CONNECT_ATTR_ADD, ● "author", "Sveta Smirnova");● mysql_options4(&mysql,MYSQL_OPT_CONNECT_ATTR_ADD, ● "session", "MySQL Performance Schema");●

● mysql_real_connect(&mysql, "127.0.0.1", "root", "",● "test", 13000, NULL, 0);

Page 20: Performance Schema для отладки MySQL приложений

Connection Attribute Tables

● mysql> select ATTR_NAME, ATTR_VALUE from ● performance_schema.session_account_connect_attrs where ● processlist_id != @@pseudo_thread_id;● +­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­+● | ATTR_NAME       | ATTR_VALUE               |● +­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­+● | _os             | Linux                    |● | _client_name    | libmysql                 |● | _pid            | 4729                     |● | program_name    | Devconf2013              |● | _platform       | x86_64                   |● | session         | MySQL Performance Schema |● | author          | Sveta Smirnova           |● | _client_version | 5.6.12                   |● +­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­+● 8 rows in set (0.01 sec)

Page 21: Performance Schema для отладки MySQL приложений

Connection Attribute Tables: не пустим чужого!

● mysql> select PROCESSLIST_ID as PID, ATTR_NAME, ● ATTR_VALUE from session_account_connect_attrs where ● attr_name='program_name';● +­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+● | PID | ATTR_NAME    | ATTR_VALUE  |● +­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+● |   9 | program_name | mysql       |● |  13 | program_name | Devconf2013 |● +­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+● 2 rows in set (0.00 sec)

Page 22: Performance Schema для отладки MySQL приложений

Connection Attribute Tables: не пустим чужого!

● mysql> select PROCESSLIST_ID as PID, ATTR_NAME,  ● ATTR_VALUE from session_account_connect_attrs where  ● attr_name='program_name' union select PROCESSLIST_ID as ● PID, 'program_name' as ATTR_NAME, ● sum(if(attr_name='program_name', 1, 0)) as ATTR_VALUE ● from session_account_connect_attrs group by ● processlist_id having(ATTR_VALUE=0);● +­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+● | PID | ATTR_NAME    | ATTR_VALUE  |● +­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+● |   9 | program_name | mysql       |● |  13 | program_name | Devconf2013 |● |  21 | program_name | 0           |● +­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+● 3 rows in set (0.01 sec)●

Page 23: Performance Schema для отладки MySQL приложений

host_cache

• Отображение DNS cache• Ошибки

– Сервера имён– Соединения– Аутентификации– max_connect_errors, max_user_errors, etc.

• Ваш первый помощник при проблемах подключения

Page 24: Performance Schema для отладки MySQL приложений

threads

• Два типа THREADS– Background– Foreground

• Поля– THREAD_ID

• Внутренний thread id– PROCESSLIST_ID

• id, которое вы видите в выводе SHOW PROCESSLIST– NAME

• Инструмент– PARENT_THREAD_ID

• Внутренний id родительского thread– PROCESSLIST_*

• Только для FOREGROUND threads

Page 25: Performance Schema для отладки MySQL приложений

threads

● mysql> select * from threads where type = 'foreground'\G● ************************ 1. row ************************●           THREAD_ID: 16●                NAME: thread/sql/one_connection●                TYPE: FOREGROUND●      PROCESSLIST_ID: 1●    PROCESSLIST_USER: root●    PROCESSLIST_HOST: localhost●      PROCESSLIST_DB: performance_schema● PROCESSLIST_COMMAND: Query●    PROCESSLIST_TIME: 0●   PROCESSLIST_STATE: Sending data●    PROCESSLIST_INFO: select * from threads where type = 'foreground'●    PARENT_THREAD_ID: 1●                ROLE: NULL●        INSTRUMENTED: YES● 1 row in set (0.00 sec)●

Page 26: Performance Schema для отладки MySQL приложений

threads

● mysql> select name from threads where type='background';● +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+● | name                                   |● +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+● | thread/sql/main                        |● | thread/innodb/io_handler_thread        |● | thread/innodb/io_handler_thread        |● | thread/innodb/io_handler_thread        |● | thread/innodb/io_handler_thread        |● | thread/innodb/io_handler_thread        |● | thread/innodb/io_handler_thread        |● | thread/innodb/srv_lock_timeout_thread  |● | thread/innodb/srv_error_monitor_thread |● | thread/innodb/srv_monitor_thread       |● | thread/innodb/srv_master_thread        |● | thread/innodb/srv_purge_thread         |● | thread/innodb/page_cleaner_thread      |● | thread/sql/signal_handler              |● +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+● 14 rows in set (0.00 sec)●

Page 27: Performance Schema для отладки MySQL приложений

events_waits_*

• EVENT_NAME– wait/synch/rwlock/innodb/dict_operation_lock

• SOURCE– Строка кода

• OPERATION– Тип операции: read, lock, write

Page 28: Performance Schema для отладки MySQL приложений

event_waits_*

● mysql> select e.EVENT_NAME, e.SOURCE, e.OPERATION, ● t.PROCESSLIST_INFO from events_waits_current e join ● threads t using(thread_id) where type='foreground' and ● processlist_id != 1\G● ************************ 1. row ************************●       EVENT_NAME:●  wait/synch/cond/sql/Item_func_sleep::cond●           SOURCE: item_func.cc:4212●        OPERATION: timed_wait● PROCESSLIST_INFO: select sleep(100) from t1● 1 row in set (0.01 sec)●

Page 29: Performance Schema для отладки MySQL приложений

wait/synch/cond/sql/Item_func_sleep::cond

● $ cat ­n  sql/item_func.cc | head ­n 4220 | tail ­n 35● 4186● 4187 /**● 4188   Wait for a given condition to be signaled.● 4189● 4190   @param cond   The condition variable to wait on.● 4191   @param mutex  The associated mutex.● 4192● 4193   @remark The absolute timeout is preserved across ● calls.● 4194● 4195   @retval return value from mysql_cond_timedwait● 4196 */● 4197●

Page 30: Performance Schema для отладки MySQL приложений

wait/synch/cond/sql/Item_func_sleep::cond

● 4198 int Interruptible_wait::wait(mysql_cond_t● *cond, mysql_mutex_t *mutex)● 4199 {● 4200   int error;● 4201   struct timespec timeout;● 4202● 4203   while (1)● 4204   {● 4205     /* Wait for a fixed interval. */● 4206     set_timespec_nsec(timeout, ● m_interrupt_interval);● 4207● 4208     /* But only if not past the absolute ● timeout. */● 4209     if (cmp_timespec(timeout, m_abs_timeout) > 0)● 4210       timeout= m_abs_timeout;●

Page 31: Performance Schema для отладки MySQL приложений

wait/synch/cond/sql/Item_func_sleep::cond

●   ● 4212     error= mysql_cond_timedwait(cond, mutex, ● &timeout);● 4213     if (error == ETIMEDOUT || error == ETIME)● 4214     {● 4215       /* Return error if timed out or connection ● is broken. */● 4216       if (!cmp_timespec(timeout, m_abs_timeout) || ● !m_thd­>is_connected())● 4217         break;● 4218     }● 4219     /* Otherwise, propagate status to the caller. ● */● 4220     else●

Page 32: Performance Schema для отладки MySQL приложений

Query statistics

● mysql> UPDATE performance_schema.threads SET ● instrumented = 'NO'; ● Query OK, 15 rows affected (0.04 sec)● Rows matched: 15  Changed: 15  Warnings: 0●

● Open new connection●

● mysql> truncate events_waits_history_long;                                                                                                                             Query OK, 0 rows affected (0.00 sec)●

● In new connection●

● mysql2> create temporary table norepl_t1 engine=myisam●  select amount, price, money, id_product from test;● Query OK, 262144 rows affected (4.76 sec)● Records: 262144  Duplicates: 0  Warnings: 0

Page 33: Performance Schema для отладки MySQL приложений

Query events_waits_history_long

● mysql> select e.EVENT_NAME, e.SOURCE, e.OPERATION,●  count(*) as cnt from events_waits_history_long e join ● threads t using(thread_id) where type='foreground' and ● processlist_id not in (1, @@pseudo_thread_id) group by ● e.EVENT_NAME, e.SOURCE, e.OPERATION order by cnt desc\G● ************************ 1. row ************************● EVENT_NAME: wait/synch/mutex/innodb/lock_mutex●     SOURCE: lock0lock.cc:5529●  OPERATION: lock●        cnt: 1428● ************************ 2. row ************************● EVENT_NAME: wait/synch/mutex/innodb/lock_mutex●     SOURCE: lock0lock.cc:6362●  OPERATION: lock●        cnt: 1428

Page 34: Performance Schema для отладки MySQL приложений

Query events_waits_history_long

● ************************ 3. row ************************● EVENT_NAME: wait/synch/mutex/innodb/trx_sys_mutex●     SOURCE: lock0lock.cc:5530●  OPERATION: lock●        cnt: 1428● ************************ 4. row ************************● EVENT_NAME: wait/synch/mutex/innodb/trx_mutex●     SOURCE: lock0lock.cc:2133●  OPERATION: lock●        cnt: 1423● ************************ 5. row ************************● EVENT_NAME: wait/io/table/sql/handler●     SOURCE: handler.cc:2627●  OPERATION: fetch●        cnt: 1423

Page 35: Performance Schema для отладки MySQL приложений

Query events_waits_history_long

● ************************ 6. row ************************● EVENT_NAME: wait/synch/mutex/innodb/lock_mutex●     SOURCE: lock0lock.cc:6050●  OPERATION: lock●        cnt: 1421● ************************ 7. row ************************● EVENT_NAME: wait/synch/mutex/innodb/trx_sys_mutex●     SOURCE: trx0sys.ic:431●  OPERATION: lock●        cnt: 1421● ************************ 8. row ************************● EVENT_NAME: wait/synch/mutex/innodb/buf_pool_mutex●     SOURCE: buf0buf.ic:887●  OPERATION: lock●        Cnt: 6● ...

Page 36: Performance Schema для отладки MySQL приложений

Какие события мы можем таким образом просматривать?

• setup_instruments.NAME – wait/io/file

• Операции с файлами– wait/io/socket– wait/io/table/sql/handler– wait/lock/table/sql/handler– wait/synch/cond

• InnoDB, MyISAM, sql– wait/synch/mutex

• sql, mysys, storage engines– wait/synch/rwlock/

• sql, InnoDB, MyISAM

Page 37: Performance Schema для отладки MySQL приложений

ps_helper

• Все VIEW для 5.5– latest_file_io– top_io_by_file– top_io_by_thread– top_global_consumers_by_avg_latency– top_global_consumers_by_total_latency– top_global_io_consumers_by_latency– top_global_io_consumers_by_bytes_usage

• Также другие для 5.6, но они используют таблицы-дайджесты

Page 38: Performance Schema для отладки MySQL приложений

Таблицы *_instances

• file_instances– Открытые файлы

• socket_instances– Соединения

• cond_instances• rwlock_instances

– select * from rwlock_instances where \ READ_LOCKED_BY_COUNT > 0;

– select * from rwlock_instances where \ WRITE_LOCKED_BY_THREAD_ID > 0;

• mutex_instances– LOCKED_BY_THREAD_ID

Page 39: Performance Schema для отладки MySQL приложений

Дайджесты

• events_stages_*• events_statements_*• events_waits_*• file_*• objects_*• socket_*• table_io_waits_*• table_lock_waits_*

Page 40: Performance Schema для отладки MySQL приложений

Дайджесты: events_stages_summary_*

• events_stages_summary_by_account_by_event_name– Как найти account, который выполняет ресурсоёмкие запросы

• events_stages_summary_by_host_by_event_name• events_stages_summary_by_user_by_event_name

– То же самое, но по хосту и имени пользователя

• events_stages_summary_by_thread_by_event_name– Можно легко узнать что прямо сейчас нагружает сервер– Так как статистика хранится какое-то время, то можно и после

события

• events_stages_summary_by_global_by_event_name– Глобальная статистика по событиям– Не указывает user, host, account и thread

Page 41: Performance Schema для отладки MySQL приложений

Дайджесты: events_statements_summary_*

• events_statements_summary_by_account_by_event_name• events_statements_summary_by_host_by_event_name • events_statements_summary_by_user_by_event_name• events_statements_summary_by_thread_by_event_name• events_statements_summary_global_by_event_name

– То же, что и для stages, но статистика берётся из events_statements_*

• events_statements_summary_by_digest– Статистика по полю digest:

• 42b93d481e96b9c9b4049b9407900194• Это запрос в виде SELECT fname FROM tname WHERE fname = ?

– Например, одним запросом можно найти все запросы, что создают временные таблицы

Page 42: Performance Schema для отладки MySQL приложений

Дайджесты: events_waits_summary_*

• events_waits_summary_by_account_by_event_name• events_waits_summary_by_host_by_event_name• events_waits_summary_by_thread_by_event_name• events_waits_summary_by_user_by_event_name • events_waits_summary_global_by_event_name

– То же, что и для events_stages_*

• events_waits_summary_by_instance – По полю OBJECT_INSTANCE_BEGIN

Page 43: Performance Schema для отладки MySQL приложений

Другие дайджесты

• file_summary_by_event_name – Не выводит название файла!

• file_summary_by_instance• objects_summary_global_by_type • socket_summary_by_event_name• socket_summary_by_event_name• socket_summary_by_instance

– Разбивка по OBJECT_INSTANCE_BEGIN

• table_io_waits_summary_by_index_usage• table_io_waits_summary_by_table• table_lock_waits_summary_by_table

Page 44: Performance Schema для отладки MySQL приложений

Дайджесты

• WHERE COUNT_STAR > 0• Сортировка или выборка по интересуемой

операции• Сортировка по COUNT_STAR

Page 45: Performance Schema для отладки MySQL приложений

Производительность

Page 46: Performance Schema для отладки MySQL приложений

Производительность: версия 5.5

• По умолчанию выключена• Значительные потери производительности

– До 7% в нагрузке RO– До 20% в нагрузке RW– По результатам тестов Дмитрия Кравчука

(http://dimitrik.free.fr/blog/archives/2010/05/mysql-performance-using-performance-schema.html)

• Нет потерь в выключенном состоянии

Page 47: Performance Schema для отладки MySQL приложений

Производительность: версия 5.6

• По умолчанию включена• Потери не столь значительны

– В большинстве случаев не более 5%, чаще ближе к 0– При всех включённых инструментах максимум до 10%– По результатам тестов Дмитрия Кравчука

(http://dimitrik.free.fr/blog/archives/2012/06/mysql-performance-pfs-overhead-in-56.html)

• global_instrumentation– Минимальный overhead

• Тонкие настройки– Основной overhead

• Таблицы history– Минимальный overhead

Page 48: Performance Schema для отладки MySQL приложений

Как P_S использует системные ресурсы

• Память– Выделяется во время старта сервера– Освобождается во время остановки– Используются массивы вместо linked lists– mysql> show engine performance_schema status;+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+| Type               | Name                      | Status   |+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+...| performance_schema | performance_schema.memory | 68024616 |+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+

• CPU– Зависит от используемых инструментов– Больше инструментов — больше нагрузка

Page 49: Performance Schema для отладки MySQL приложений

Настройка

Page 50: Performance Schema для отладки MySQL приложений

Что, где и когда настраивается

• Во время компиляции• При старте сервера

– Опции в my.cnf– Все опции нединамические

• Runtime– Таблицы setup_*

• Что можно настроить– См. соответствующие таблицы

Page 51: Performance Schema для отладки MySQL приложений

Конфигурационные опции

• performance_schema = ON|OFF– Включена/выключена

• performance_schema_%_size– Размеры истории– Размеры инструментированных объектов

• performance_schema_max_%_classes– Максимальное число cond|fle|io|% инструментов

• performance_schema_max_%_instances– Максимальное число cond|fle|io|% объектов

Page 52: Performance Schema для отладки MySQL приложений

Конфигурационные опции

• performance_schema_consumer_ИМЯ_ТАБЛИЦЫ– performance_schema_consumer_events_stages_current– performance_schema_consumer_events_waits_current– ...

• Включает и выключает инструментирование– OFF, FALSE, 0– ON, TRUE, 1

• Таблица setup_consumers– update setup_consumers set enabled='no' \where name='events_stages_current';

Page 53: Performance Schema для отладки MySQL приложений

Таблицы setup_actors и setup_objects

• setup_actors– Какие пользовательские потоки мониторить– DELETE , затем INSERT– UPDATE не разрешён– insert into setup_actors values('%', 'sveta', '%');

• Только для пользователя sveta

• setup_objects– Какие объекты мониторить– update setup_objects set enabled='no' \where object_schema='%';

– insert into setup_objects values \('TABLE', 'test', 't1', 'YES', 'YES');

Page 54: Performance Schema для отладки MySQL приложений

Таблица setup_instruments

• Тонкая настройка инструментов• Всего 549 инструментов в стандартной поставке• update setup_instruments set enabled='no';• update setup_instruments set enabled='yes' \where name like 'statement%';

Page 55: Performance Schema для отладки MySQL приложений

Таймеры

● Значения для вашей машины●

● mysql> select * from performance_timers;● +­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+● | TIMER_NAME  | TIMER_FREQUENCY | TIMER_RESOLUTION | TIMER_OVERHEAD |● +­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+● | CYCLE       |      2592796019 |                1 |             18 |● | NANOSECOND  |      1000000000 |                1 |             45 |● | MICROSECOND |         1000000 |                1 |             48 |● | MILLISECOND |            1037 |                1 |             54 |● | TICK        |             103 |                1 |            547 |● +­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+● 5 rows in set (0.00 sec)●

● Как настроить:● mysql> update setup_timers set timer_name='tick' \● where name = 'stage';

Page 56: Performance Schema для отладки MySQL приложений

Что происходит внутри

● mysql> show global status like 'perf%';● +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­+● | Variable_name                                 | Value |● +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­+● | Performance_schema_accounts_lost              | 0     |● | Performance_schema_cond_classes_lost          | 0     |● | Performance_schema_cond_instances_lost        | 0     |● | Performance_schema_digest_lost                | 0     |● ...●

● Если Value ненулевое — это значит, что вы выставили слишком ● маленькие значения *_size

Page 57: Performance Schema для отладки MySQL приложений

Что происходит внутри

• SHOW ENGINE PERFORMANCE_SCHEMA STATUS;• Содержит информацию об использовании памяти• Имя_таблицы.атрибут• (Внутренний_буфер).атрибут• *.size, *.row_size

– Неконфигурируемый, например, размер строки таблицы

• *.count, *.row_count– Конфигурируемый при помощи опций

• *.memory– size * count– events_waits_history_long.memory– performance_schema.memory

Page 58: Performance Schema для отладки MySQL приложений

Где искать информацию

• http://www.markleith.co.uk/ps_helper/• http://www.drdobbs.com/database/detailed-profiling-of-sql-activity-in-my/240154959

• http://marcalff.blogspot.ru• http://dimitrik.free.fr/blog/•

Page 59: Performance Schema для отладки MySQL приложений

Итоги

• Performance schema — отличное подспорье для DBA при отладке проблем производительности

• Конфигурируется без перезагрузки• Тонко настраивается• Подстраивайте её под свои нужды!• Инструментируйте только то, что реально нужно

Page 60: Performance Schema для отладки MySQL приложений

?

Page 61: Performance Schema для отладки MySQL приложений

СПАСИБО!

Page 62: Performance Schema для отладки MySQL приложений

The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions.The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.