<Insert Picture Here>

Performance Schema для отладки MySQL приложений
Sveta Smirnova
Ведущий инженер технической поддержк...
Содержание
•
•
•
•
•
•
•
•
•

История Performance Schema
Таблицы для DBA
Таблицы для разработчика
Другие таблицы
Инструмен...
История Performance Schema
•
•
•
•

Первая версия: 5.5
17 таблиц
Полезна в основном для разработчиков MySQL
Инструменты дл...
Типы таблиц
• Настройки
– _setup
– _instances

• События
– events_waits_

• Дайджесты
• История
• Другие
Версия 5.6 повернулась лицом к DBA
• Больше возможностей
• 52 таблицы
• Новые таблицы
предназначены для DBA
• Знание MySQL...
Таблицы для DBA
• events_statements_*
• events_stages_*
• Connection
events_statements_*
• Запросы
– statement/sql
• statement/sql/delete
• statement/sql/select

• Команды
– COM_PING, COM_QUI...
events_statements_*: поиск ошибочных запросов
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select THREAD_ID, substr(SQL_TEXT, 1, ...
events_statements_*: запросы, требующие
оптимизации
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select THREAD_ID as TID, substr(...
events_statements_*: что ещё посмотреть
•
•
•
•
•
•
•
•
•

CREATED_TMP_DISK_TABLES
CREATED_TMP_TABLES
SELECT_FULL_JOIN
SEL...
events_statements_*: ps_helper view
•
•
•
•
•
•
•

http://www.markleith.co.uk/ps_helper/
View: statement_analysis
View: st...
event_stages_*
• Та же информация, что и в поле State
INFORMATION_SCHEMA.PROCESSLIST или
SHOW PROCESSLIST
–
–
–
–

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

mysql> select events_stages_history_lo...
event_stages_*: другие потенциально медленные
операции
• Все, относящиеся к временным таблицам
– EVENT_NAME LIKE 'stage/sq...
event_stages_*: выборка самых долгих
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select eshl.event_name, sql_text,
eshl.time...
event_stages_*: объединения
• NESTING_EVENT_ID
– Statement
– Wait
– Stage

• EVENT_ID

events_statements
EVENT_ID
events_s...
Connection Tables: accounts
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select user, host, current_connections as cur, 
total_connecti...
Connection Tables: users, hosts
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select user, current_connections as cur, 
...
Connection Attribute Tables
●
●
●

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

●
●
●
●
●
●...
Connection Attribute Tables
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select ATTR_NAME, ATTR_VALUE from 
performance_schem...
Connection Attribute Tables: не пустим чужого!
●
●
●
●
●
●
●
●
●
●
●

mysql> select PROCESSLIST_ID as PID, ATTR_NAME, 
ATT...
Connection Attribute Tables: не пустим чужого!
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select PROCESSLIST_ID as PID, A...
host_cache
• Отображение DNS cache
• Ошибки
–
–
–
–

Сервера имён
Соединения
Аутентификации
max_connect_errors, max_user_e...
threads
• Два типа THREADS
– Background
– Foreground

• Поля
– THREAD_ID
• Внутренний thread id
– PROCESSLIST_ID
• id, кот...
threads
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select * from threads where type = 'foreground'G
*******************...
threads
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select name from threads where type='background';
+­­­­­­­­­­­...
events_waits_*
• EVENT_NAME
– wait/synch/rwlock/innodb/dict_operation_lock

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

• OPERATION
– Тип опер...
event_waits_*
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select e.EVENT_NAME, e.SOURCE, e.OPERATION, 
t.PROCESSLIST_INFO from event...
wait/synch/cond/sql/Item_func_sleep::cond
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

$ cat ­n  sql/item_func.cc | head ­n 4220 | tai...
wait/synch/cond/sql/Item_func_sleep::cond
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

4198 int Interruptible_wait::wait(mysql_con...
wait/synch/cond/sql/Item_func_sleep::cond
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

  
4212     error= mysql_cond_timedwait(cond, mut...
Query statistics
●
●
●
●
●

mysql> UPDATE performance_schema.threads SET 
instrumented = 'NO'; 
Query OK, 15 rows affected...
Query events_waits_history_long
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

mysql> select e.EVENT_NAME, e.SOURCE, e.OPERATION,
 count...
Query events_waits_history_long
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

************************ 3. row ************************
...
Query events_waits_history_long
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

************************ 6. row ***********************...
Какие события мы можем таким образом
просматривать?
• setup_instruments.NAME
– wait/io/file
• Операции с файлами
– wait/io...
ps_helper
• Все VIEW для 5.5
–
–
–
–
–
–
–

latest_file_io
top_io_by_file
top_io_by_thread
top_global_consumers_by_avg_lat...
Таблицы *_instances
• file_instances
– Открытые файлы

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

• cond_instances
• rwlock_instance...
Дайджесты
•
•
•
•
•
•
•
•

events_stages_*
events_statements_*
events_waits_*
file_*
objects_*
socket_*
table_io_waits_*
t...
Дайджесты: events_stages_summary_*
• events_stages_summary_by_account_by_event_name
– Как найти account, который выполняет...
•
•
•
•
•

Дайджесты: events_statements_summary_*
events_statements_summary_by_account_by_event_name
events_statements_sum...
Дайджесты: events_waits_summary_*
•
•
•
•
•

events_waits_summary_by_account_by_event_name
events_waits_summary_by_host_by...
Другие дайджесты
• file_summary_by_event_name
– Не выводит название файла!

•
•
•
•
•

file_summary_by_instance
objects_su...
Дайджесты
• WHERE COUNT_STAR > 0
• Сортировка или выборка по интересуемой
операции
• Сортировка по COUNT_STAR
Производительность
Производительность: версия 5.5
• По умолчанию выключена
• Значительные потери производительности
– До 7% в нагрузке RO
– Д...
Производительность: версия 5.6
• По умолчанию включена
• Потери не столь значительны
– В большинстве случаев не более 5%, ...
Как P_S использует системные ресурсы
• Память
–
–
–
–

Выделяется во время старта сервера
Освобождается во время остановки...
Настройка
Что, где и когда настраивается
• Во время компиляции
• При старте сервера
– Опции в my.cnf
– Все опции нединамические

• R...
Конфигурационные опции
• performance_schema = ON|OFF
– Включена/выключена

• performance_schema_%_size
– Размеры истории
–...
Конфигурационные опции
• performance_schema_consumer_ИМЯ_ТАБЛИЦЫ
– performance_schema_consumer_events_stages_current
– per...
Таблицы setup_actors и setup_objects
• setup_actors
–
–
–
–

Какие пользовательские потоки мониторить
DELETE , затем INSER...
•
•
•
•

Таблица setup_instruments
Тонкая настройка инструментов
Всего 549 инструментов в стандартной поставке
update setu...
Таймеры
●

●

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

●
●
●
●
●
●
●
●
●
●
●
●

mysql> select * from performance_timers;
+­­­­­­­­­­­­­+...
Что происходит внутри
●
●
●
●
●
●
●
●
●
●

mysql> show global status like 'perf%';
+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­...
•
•
•
•
•

Что происходит внутри
SHOW ENGINE PERFORMANCE_SCHEMA STATUS;
Содержит информацию об использовании памяти
Имя_та...
Где искать информацию
• http://www.markleith.co.uk/ps_helper/
• http://www.drdobbs.com/database/detailed-profiling-of-sql-...
Итоги
• Performance schema — отличное подспорье для
DBA при отладке проблем производительности
• Конфигурируется без перез...
?
СПАСИБО!
The preceding is intended to outline our general
product direction. It is intended for information
purposes only, and may ...
Upcoming SlideShare
Loading in …5
×

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

1,090 views
937 views

Published on

Slides from Devconf 2013.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,090
On SlideShare
0
From Embeds
0
Number of Embeds
17
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. <Insert Picture Here> Performance Schema для отладки MySQL приложений Sveta Smirnova Ведущий инженер технической поддержки MySQL
  2. 2. Содержание • • • • • • • • • История Performance Schema Таблицы для DBA Таблицы для разработчика Другие таблицы Инструменты Производительность и тесты Настройка Где найти информацию Итоги
  3. 3. История Performance Schema • • • • Первая версия: 5.5 17 таблиц Полезна в основном для разработчиков MySQL Инструменты для – Mutex-ов – Блокировок • Требует хорошего знания кода MySQL
  4. 4. Типы таблиц • Настройки – _setup – _instances • События – events_waits_ • Дайджесты • История • Другие
  5. 5. Версия 5.6 повернулась лицом к DBA • Больше возможностей • 52 таблицы • Новые таблицы предназначены для DBA • Знание MySQL кода больше не необходимое условие * *Рассказываю как я рада нововведениям в Performance Schema, появившимся в версии 5.6 на конференции Devconf2012
  6. 6. Таблицы для DBA • events_statements_* • events_stages_* • Connection
  7. 7. 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
  8. 8. 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)
  9. 9. 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)
  10. 10. 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
  11. 11. 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
  12. 12. event_stages_* • Та же информация, что и в поле State INFORMATION_SCHEMA.PROCESSLIST или SHOW PROCESSLIST – – – – init executing Opening tables ... • Замена SHOW PROFILE • Только на уровне сервера • Информации от табличных движков в этой таблице нет!
  13. 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. 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. 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)
  16. 16. 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
  17. 17. 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)
  18. 18. 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)
  19. 19. 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);
  20. 20. 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)
  21. 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. 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. 23. host_cache • Отображение DNS cache • Ошибки – – – – Сервера имён Соединения Аутентификации max_connect_errors, max_user_errors, etc. • Ваш первый помощник при проблемах подключения
  24. 24. threads • Два типа THREADS – Background – Foreground • Поля – THREAD_ID • Внутренний thread id – PROCESSLIST_ID • id, которое вы видите в выводе SHOW PROCESSLIST – NAME • Инструмент – PARENT_THREAD_ID • Внутренний id родительского thread – PROCESSLIST_* • Только для FOREGROUND threads
  25. 25. 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)
  26. 26. 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)
  27. 27. events_waits_* • EVENT_NAME – wait/synch/rwlock/innodb/dict_operation_lock • SOURCE – Строка кода • OPERATION – Тип операции: read, lock, write
  28. 28. 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 != 1G ************************ 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)
  29. 29. 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
  30. 30. 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;
  31. 31. 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
  32. 32. 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
  33. 33. 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 descG ************************ 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
  34. 34. 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
  35. 35. 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 ...
  36. 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. 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. 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
  39. 39. Дайджесты • • • • • • • • events_stages_* events_statements_* events_waits_* file_* objects_* socket_* table_io_waits_* table_lock_waits_*
  40. 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
  41. 41. • • • • • Дайджесты: 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 = ? – Например, одним запросом можно найти все запросы, что создают временные таблицы
  42. 42. Дайджесты: 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
  43. 43. Другие дайджесты • 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
  44. 44. Дайджесты • WHERE COUNT_STAR > 0 • Сортировка или выборка по интересуемой операции • Сортировка по COUNT_STAR
  45. 45. Производительность
  46. 46. Производительность: версия 5.5 • По умолчанию выключена • Значительные потери производительности – До 7% в нагрузке RO – До 20% в нагрузке RW – По результатам тестов Дмитрия Кравчука (http://dimitrik.free.fr/blog/archives/2010/05/mysql-performance-using-performance-schema.html ) • Нет потерь в выключенном состоянии
  47. 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. 48. Как P_S использует системные ресурсы • Память – – – – Выделяется во время старта сервера Освобождается во время остановки Используются массивы вместо linked lists mysql> show engine performance_schema status; +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+ | Type               | Name                      | Status   | +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+ ... | performance_schema | performance_schema.memory | 68024616 | +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+ • CPU – Зависит от используемых инструментов – Больше инструментов — больше нагрузка
  49. 49. Настройка
  50. 50. Что, где и когда настраивается • Во время компиляции • При старте сервера – Опции в my.cnf – Все опции нединамические • Runtime – Таблицы setup_* • Что можно настроить – См. соответствующие таблицы
  51. 51. Конфигурационные опции • performance_schema = ON|OFF – Включена/выключена • performance_schema_%_size – Размеры истории – Размеры инструментированных объектов • performance_schema_max_%_classes – Максимальное число cond|fle|io|% инструментов • performance_schema_max_%_instances – Максимальное число cond|fle|io|% объектов
  52. 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. 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. 54. • • • • Таблица setup_instruments Тонкая настройка инструментов Всего 549 инструментов в стандартной поставке update setup_instruments set enabled='no'; update setup_instruments set enabled='yes'  where name like 'statement%';
  55. 55. Таймеры ● ● Значения для вашей машины ● ● ● ● ● ● ● ● ● ● ● ● 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';
  56. 56. Что происходит внутри ● ● ● ● ● ● ● ● ● ● 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
  57. 57. • • • • • Что происходит внутри SHOW ENGINE PERFORMANCE_SCHEMA STATUS; Содержит информацию об использовании памяти Имя_таблицы.атрибут (Внутренний_буфер).атрибут *.size, *.row_size – Неконфигурируемый, например, размер строки таблицы • *.count, *.row_count – Конфигурируемый при помощи опций • *.memory – size * count – events_waits_history_long.memory – performance_schema.memory
  58. 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. 59. Итоги • Performance schema — отличное подспорье для DBA при отладке проблем производительности • Конфигурируется без перезагрузки • Тонко настраивается • Подстраивайте её под свои нужды! • Инструментируйте только то, что реально нужно
  60. 60. ?
  61. 61. СПАСИБО!
  62. 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.

×