SlideShare una empresa de Scribd logo
1 de 62
Descargar para leer sin conexión
<Insert Picture Here>

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

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

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

• Требует хорошего знания кода MySQL
Типы таблиц
• Настройки
– _setup
– _instances

• События
– events_waits_

• Дайджесты
• История
• Другие
Версия 5.6 повернулась лицом к DBA
• Больше возможностей
• 52 таблицы
• Новые таблицы
предназначены для DBA
• Знание MySQL кода
больше не необходимое
условие

*

*Рассказываю как я рада нововведениям в Performance Schema, появившимся в версии 5.6 на конференции Devconf2012
Таблицы для DBA
• events_statements_*
• events_stages_*
• Connection
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
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)
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)
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
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
event_stages_*
• Та же информация, что и в поле State
INFORMATION_SCHEMA.PROCESSLIST или
SHOW PROCESSLIST
–
–
–
–

init
executing
Opening tables
...

• Замена SHOW PROFILE
• Только на уровне сервера
• Информации от табличных движков в этой
таблице нет!
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)
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'
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)
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
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)
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)
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);
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)
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)
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)
host_cache
• Отображение DNS cache
• Ошибки
–
–
–
–

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

• Ваш первый помощник при проблемах
подключения
threads
• Два типа THREADS
– Background
– Foreground

• Поля
– THREAD_ID
• Внутренний thread id
– PROCESSLIST_ID
• id, которое вы видите в выводе SHOW PROCESSLIST
– NAME
• Инструмент
– PARENT_THREAD_ID
• Внутренний id родительского thread
– PROCESSLIST_*
• Только для FOREGROUND threads
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)
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)
events_waits_*
• EVENT_NAME
– wait/synch/rwlock/innodb/dict_operation_lock

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

• OPERATION
– Тип операции: read, lock, write
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)
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
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;
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
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
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
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
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
...
Какие события мы можем таким образом
просматривать?
• 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
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, но они используют таблицыдайджесты
Таблицы *_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
Дайджесты
•
•
•
•
•
•
•
•

events_stages_*
events_statements_*
events_waits_*
file_*
objects_*
socket_*
table_io_waits_*
table_lock_waits_*
Дайджесты: 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
•
•
•
•
•

Дайджесты: 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 = ?
– Например, одним запросом можно найти все запросы, что создают
временные таблицы
Дайджесты: 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
Другие дайджесты
• 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
Дайджесты
• WHERE COUNT_STAR > 0
• Сортировка или выборка по интересуемой
операции
• Сортировка по COUNT_STAR
Производительность
Производительность: версия 5.5
• По умолчанию выключена
• Значительные потери производительности
– До 7% в нагрузке RO
– До 20% в нагрузке RW
– По результатам тестов Дмитрия Кравчука
(http://dimitrik.free.fr/blog/archives/2010/05/mysql-performance-using-performance-schema.html )

• Нет потерь в выключенном состоянии
Производительность: версия 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
Как P_S использует системные ресурсы
• Память
–
–
–
–

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

• CPU
– Зависит от используемых инструментов
– Больше инструментов — больше нагрузка
Настройка
Что, где и когда настраивается
• Во время компиляции
• При старте сервера
– Опции в my.cnf
– Все опции нединамические

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

• Что можно настроить
– См. соответствующие таблицы
Конфигурационные опции
• performance_schema = ON|OFF
– Включена/выключена

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

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

• performance_schema_max_%_instances
– Максимальное число cond|fle|io|% объектов
Конфигурационные опции
• 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';
Таблицы 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');
•
•
•
•

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

●

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

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

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';
Что происходит внутри
●
●
●
●
●
●
●
●
●
●

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
•
•
•
•
•

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

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

• *.memory
– size * count
– events_waits_history_long.memory
– performance_schema.memory
Где искать информацию
• 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/
•
Итоги
• Performance schema — отличное подспорье для
DBA при отладке проблем производительности
• Конфигурируется без перезагрузки
• Тонко настраивается
• Подстраивайте её под свои нужды!
• Инструментируйте только то, что реально нужно
?
СПАСИБО!
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.

Más contenido relacionado

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

Mysql replication DevConf 2012
Mysql replication DevConf 2012Mysql replication DevConf 2012
Mysql replication DevConf 2012
Alex Chistyakov
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Sveta Smirnova
 
Simonova sql server-enginetesting
Simonova sql server-enginetestingSimonova sql server-enginetesting
Simonova sql server-enginetesting
LiloSEA
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
Alex Chistyakov
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Sveta Smirnova
 
Learning and Certification for Developer
Learning and Certification for DeveloperLearning and Certification for Developer
Learning and Certification for Developer
Andrey Korshikov
 

Similar a Performance Schema для отладки MySQL приложений (20)

MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.
 
Embarcadero Team Server для администраторов БД
Embarcadero Team Server для администраторов БДEmbarcadero Team Server для администраторов БД
Embarcadero Team Server для администраторов БД
 
Mysql replication DevConf 2012
Mysql replication DevConf 2012Mysql replication DevConf 2012
Mysql replication DevConf 2012
 
Обзор инструментов Toad для администраторов Oracle
Обзор инструментов Toad для администраторов OracleОбзор инструментов Toad для администраторов Oracle
Обзор инструментов Toad для администраторов Oracle
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_ru
 
Simonova sql server-enginetesting
Simonova sql server-enginetestingSimonova sql server-enginetesting
Simonova sql server-enginetesting
 
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
 
Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.
 
Как использовать Rapid SQL для ускорения разработки SQL и другого кода для СУБД
Как использовать Rapid SQL для ускорения разработки SQL и другого кода для СУБДКак использовать Rapid SQL для ускорения разработки SQL и другого кода для СУБД
Как использовать Rapid SQL для ускорения разработки SQL и другого кода для СУБД
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
 
Организация процесса ручного тестирования
Организация процесса ручного тестированияОрганизация процесса ручного тестирования
Организация процесса ручного тестирования
 
Tfs Overview And Architecture (www.cmcons.com)
Tfs Overview And Architecture (www.cmcons.com)Tfs Overview And Architecture (www.cmcons.com)
Tfs Overview And Architecture (www.cmcons.com)
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
 
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
 
"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)
 
Zero Downtime PHP Deployment with Envoyer And Forge
Zero Downtime PHP Deployment with Envoyer And ForgeZero Downtime PHP Deployment with Envoyer And Forge
Zero Downtime PHP Deployment with Envoyer And Forge
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
 
Learning and Certification for Developer
Learning and Certification for DeveloperLearning and Certification for Developer
Learning and Certification for Developer
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
 

Más de Sveta Smirnova

MySQL Test Framework для поддержки клиентов и верификации багов
MySQL Test Framework для поддержки клиентов и верификации баговMySQL Test Framework для поддержки клиентов и верификации багов
MySQL Test Framework для поддержки клиентов и верификации багов
Sveta Smirnova
 
How to Avoid Pitfalls in Schema Upgrade with Percona XtraDB Cluster
How to Avoid Pitfalls in Schema Upgrade with Percona XtraDB ClusterHow to Avoid Pitfalls in Schema Upgrade with Percona XtraDB Cluster
How to Avoid Pitfalls in Schema Upgrade with Percona XtraDB Cluster
Sveta Smirnova
 

Más de Sveta Smirnova (20)

MySQL 2024: Зачем переходить на MySQL 8, если в 5.х всё устраивает?
MySQL 2024: Зачем переходить на MySQL 8, если в 5.х всё устраивает?MySQL 2024: Зачем переходить на MySQL 8, если в 5.х всё устраивает?
MySQL 2024: Зачем переходить на MySQL 8, если в 5.х всё устраивает?
 
Database in Kubernetes: Diagnostics and Monitoring
Database in Kubernetes: Diagnostics and MonitoringDatabase in Kubernetes: Diagnostics and Monitoring
Database in Kubernetes: Diagnostics and Monitoring
 
MySQL Database Monitoring: Must, Good and Nice to Have
MySQL Database Monitoring: Must, Good and Nice to HaveMySQL Database Monitoring: Must, Good and Nice to Have
MySQL Database Monitoring: Must, Good and Nice to Have
 
MySQL Cookbook: Recipes for Developers
MySQL Cookbook: Recipes for DevelopersMySQL Cookbook: Recipes for Developers
MySQL Cookbook: Recipes for Developers
 
MySQL Performance for DevOps
MySQL Performance for DevOpsMySQL Performance for DevOps
MySQL Performance for DevOps
 
MySQL Test Framework для поддержки клиентов и верификации багов
MySQL Test Framework для поддержки клиентов и верификации баговMySQL Test Framework для поддержки клиентов и верификации багов
MySQL Test Framework для поддержки клиентов и верификации багов
 
MySQL Cookbook: Recipes for Your Business
MySQL Cookbook: Recipes for Your BusinessMySQL Cookbook: Recipes for Your Business
MySQL Cookbook: Recipes for Your Business
 
Introduction into MySQL Query Tuning for Dev[Op]s
Introduction into MySQL Query Tuning for Dev[Op]sIntroduction into MySQL Query Tuning for Dev[Op]s
Introduction into MySQL Query Tuning for Dev[Op]s
 
MySQL Performance for DevOps
MySQL Performance for DevOpsMySQL Performance for DevOps
MySQL Performance for DevOps
 
How to Avoid Pitfalls in Schema Upgrade with Percona XtraDB Cluster
How to Avoid Pitfalls in Schema Upgrade with Percona XtraDB ClusterHow to Avoid Pitfalls in Schema Upgrade with Percona XtraDB Cluster
How to Avoid Pitfalls in Schema Upgrade with Percona XtraDB Cluster
 
How to migrate from MySQL to MariaDB without tears
How to migrate from MySQL to MariaDB without tearsHow to migrate from MySQL to MariaDB without tears
How to migrate from MySQL to MariaDB without tears
 
Modern solutions for modern database load: improvements in the latest MariaDB...
Modern solutions for modern database load: improvements in the latest MariaDB...Modern solutions for modern database load: improvements in the latest MariaDB...
Modern solutions for modern database load: improvements in the latest MariaDB...
 
How Safe is Asynchronous Master-Master Setup?
How Safe is Asynchronous Master-Master Setup?How Safe is Asynchronous Master-Master Setup?
How Safe is Asynchronous Master-Master Setup?
 
How to Avoid Pitfalls in Schema Upgrade with Galera
How to Avoid Pitfalls in Schema Upgrade with GaleraHow to Avoid Pitfalls in Schema Upgrade with Galera
How to Avoid Pitfalls in Schema Upgrade with Galera
 
How Safe is Asynchronous Master-Master Setup?
 How Safe is Asynchronous Master-Master Setup? How Safe is Asynchronous Master-Master Setup?
How Safe is Asynchronous Master-Master Setup?
 
Introduction to MySQL Query Tuning for Dev[Op]s
Introduction to MySQL Query Tuning for Dev[Op]sIntroduction to MySQL Query Tuning for Dev[Op]s
Introduction to MySQL Query Tuning for Dev[Op]s
 
Billion Goods in Few Categories: How Histograms Save a Life?
Billion Goods in Few Categories: How Histograms Save a Life?Billion Goods in Few Categories: How Histograms Save a Life?
Billion Goods in Few Categories: How Histograms Save a Life?
 
A Billion Goods in a Few Categories: When Optimizer Histograms Help and When ...
A Billion Goods in a Few Categories: When Optimizer Histograms Help and When ...A Billion Goods in a Few Categories: When Optimizer Histograms Help and When ...
A Billion Goods in a Few Categories: When Optimizer Histograms Help and When ...
 
Что нужно знать о трёх топовых фичах MySQL
Что нужно знать  о трёх топовых фичах  MySQLЧто нужно знать  о трёх топовых фичах  MySQL
Что нужно знать о трёх топовых фичах MySQL
 
Billion Goods in Few Categories: How Histograms Save a Life?
Billion Goods in Few Categories: How Histograms Save a Life?Billion Goods in Few Categories: How Histograms Save a Life?
Billion Goods in Few Categories: How Histograms Save a Life?
 

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