3. История Performance Schema
•
•
•
•
Первая версия: 5.5
17 таблиц
Полезна в основном для разработчиков MySQL
Инструменты для
– Mutex-ов
– Блокировок
• Требует хорошего знания кода MySQL
4. Типы таблиц
• Настройки
– _setup
– _instances
• События
– events_waits_
• Дайджесты
• История
• Другие
5. Версия 5.6 повернулась лицом к DBA
• Больше возможностей
• 52 таблицы
• Новые таблицы
предназначены для DBA
• Знание MySQL кода
больше не необходимое
условие
*
*Рассказываю как я рада нововведениям в Performance Schema, появившимся в версии 5.6 на конференции Devconf2012
12. event_stages_*
• Та же информация, что и в поле State
INFORMATION_SCHEMA.PROCESSLIST или
SHOW PROCESSLIST
–
–
–
–
init
executing
Opening tables
...
• Замена SHOW PROFILE
• Только на уровне сервера
• Информации от табличных движков в этой
таблице нет!
13. 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 descG
************************ 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)
14. 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'
15. 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*1000000000000G
************************ 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)
21. 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)
22. 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)
23. host_cache
• Отображение DNS cache
• Ошибки
–
–
–
–
Сервера имён
Соединения
Аутентификации
max_connect_errors, max_user_errors, etc.
• Ваш первый помощник при проблемах
подключения
24. threads
• Два типа THREADS
– Background
– Foreground
• Поля
– THREAD_ID
• Внутренний thread id
– PROCESSLIST_ID
• id, которое вы видите в выводе SHOW PROCESSLIST
– NAME
• Инструмент
– PARENT_THREAD_ID
• Внутренний id родительского thread
– PROCESSLIST_*
• Только для FOREGROUND threads
36. Какие события мы можем таким образом
просматривать?
• 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
37. 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, но они используют таблицыдайджесты
38. Таблицы *_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
40. Дайджесты: 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
46. Производительность: версия 5.5
• По умолчанию выключена
• Значительные потери производительности
– До 7% в нагрузке RO
– До 20% в нагрузке RW
– По результатам тестов Дмитрия Кравчука
(http://dimitrik.free.fr/blog/archives/2010/05/mysql-performance-using-performance-schema.html )
• Нет потерь в выключенном состоянии
47. Производительность: версия 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
48. Как P_S использует системные ресурсы
• Память
–
–
–
–
Выделяется во время старта сервера
Освобождается во время остановки
Используются массивы вместо linked lists
mysql> show engine performance_schema status;
++++
| Type | Name | Status |
++++
...
| performance_schema | performance_schema.memory | 68024616 |
++++
• CPU
– Зависит от используемых инструментов
– Больше инструментов — больше нагрузка
50. Что, где и когда настраивается
• Во время компиляции
• При старте сервера
– Опции в my.cnf
– Все опции нединамические
• Runtime
– Таблицы setup_*
• Что можно настроить
– См. соответствующие таблицы
51. Конфигурационные опции
• performance_schema = ON|OFF
– Включена/выключена
• performance_schema_%_size
– Размеры истории
– Размеры инструментированных объектов
• performance_schema_max_%_classes
– Максимальное число cond|fle|io|% инструментов
• performance_schema_max_%_instances
– Максимальное число cond|fle|io|% объектов
52. Конфигурационные опции
• 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';
53. Таблицы 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');
54. •
•
•
•
Таблица setup_instruments
Тонкая настройка инструментов
Всего 549 инструментов в стандартной поставке
update setup_instruments set enabled='no';
update setup_instruments set enabled='yes'
where name like 'statement%';
57. •
•
•
•
•
Что происходит внутри
SHOW ENGINE PERFORMANCE_SCHEMA STATUS;
Содержит информацию об использовании памяти
Имя_таблицы.атрибут
(Внутренний_буфер).атрибут
*.size, *.row_size
– Неконфигурируемый, например, размер строки таблицы
• *.count, *.row_count
– Конфигурируемый при помощи опций
• *.memory
– size * count
– events_waits_history_long.memory
– performance_schema.memory
58. Где искать информацию
• 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/
•
59. Итоги
• Performance schema — отличное подспорье для
DBA при отладке проблем производительности
• Конфигурируется без перезагрузки
• Тонко настраивается
• Подстраивайте её под свои нужды!
• Инструментируйте только то, что реально нужно
62. 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.