Введение в отладку производительности MySQL приложений

34
<Insert Picture Here> Введение в отладку производительности MySQL приложений Света Смирнова Ведущий инженер технической поддержки MySQL

description

Презентация была сделана на FailOver Conference 2014.

Transcript of Введение в отладку производительности MySQL приложений

Page 1: Введение в отладку производительности MySQL приложений

<Insert Picture Here>

Введение в отладку производительности MySQL приложений

Света СмирноваВедущий инженер технической поддержки MySQL

Page 2: Введение в отладку производительности MySQL приложений

Никакой рыбы!

Page 3: Введение в отладку производительности MySQL приложений

Удочки

• Одиночный запрос• Параллельное выполнение

– Внутренние блокировки– Борьба за системные ресурсы

• Системные ресурсы• Репликация• Инструменты

– Контроль опций– INFORMATION_SCHEMA– PERFORMANCE_SCHEMA– Системные утилиты

Page 4: Введение в отладку производительности MySQL приложений

Узкое место

Page 5: Введение в отладку производительности MySQL приложений

Как выявить узкое место

• ...• <some code>• Измеряем Время_Начала (операции)• mysql_real_query(....)• Измеряем Время_Завершения (операции)• <some code>• ....•

• Нам нужно• (Время_Завершения - Время_Начала)

Page 6: Введение в отладку производительности MySQL приложений

С чего начать?

Page 7: Введение в отладку производительности MySQL приложений

Отлаженные запросы — основа высокой производительности!

Page 8: Введение в отладку производительности MySQL приложений

Безграничные возможности: всегда тестируйте!

Page 9: Введение в отладку производительности MySQL приложений

Настройки

• Переменные– SET [SESSION|GLOBAL] var_name=NEW_VALUE– Сессионные (SESSION)– Глобальные (GLOBAL)

• Параметры командной строки• Конфигурационные файлы

Page 10: Введение в отладку производительности MySQL приложений

Параллельное выполнение

Page 11: Введение в отладку производительности MySQL приложений

Итерации

Page 12: Введение в отладку производительности MySQL приложений

Binary log, SQL thread и IO thread

Page 13: Введение в отладку производительности MySQL приложений

Репликация и итерации

Page 14: Введение в отладку производительности MySQL приложений

Одиночный запрос: где найти?

• При разработке приложения• PROCESSLIST

– SHOW [FULL] PROCESSLIST– INFORMATION_SCHEMA.PROCESSLIST

• Лог медленных запросов (slow query log)– По требованию– Вывод в таблицу– mysqldumpslow

• Лог вашего приложения• Жалобы пользователей

Page 15: Введение в отладку производительности MySQL приложений

Одиночный запрос: что он делает?

• PERFORMANCE_SCHEMA.EVENTS_STAGES_%• PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_%

– mysql> SELECT STMTS.SQL_TEXT, STAGES.EVENT_NAME, STAGES.TIMER_WAIT FROM PERFORMANCE_SCHEMA.EVENTS_STAGES_HISTORY_LONG STAGES JOIN PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_HISTORY_LONG STMTS ON (STMTS.EVENT_ID=STAGES.NESTING_EVENT_ID) WHERE CURRENT_SCHEMA='EMPLOYEES';

– +­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+

– | sql_text   | event_name                  | timer_wait    |

– +­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+

– | select co  | stage/sql/init              |     189755000 |

– | select co  | stage/sql/Opening tables    |      40828000 |

– | select co  | stage/sql/System lock       |     185069000 |

• SHOW STATUS LIKE 'Handler_%'

Page 16: Введение в отладку производительности MySQL приложений

Одиночный запрос: почему?

• EXPLAIN– EXPLAIN EXTENDED - всегда в 5.7+– EXPLAIN PARTITIONS - всегда в 5.7+– EXPLAIN FORMAT=JSON

• INFORMATION_SCHEMA.OPTIMIZER_TRACE• SHOW INDEX

– Как чинить• OPTIMIZE или ANALYZE TABLE• innodb_stats_persistent

Page 17: Введение в отладку производительности MySQL приложений

Одиночный запрос: устранение проблемы

• Переписать запрос!• Если нельзя или не помогает:

– Index hints:• FORCE|USE INDEX• IGNORE INDEX• Обязательно тестируйте все обновления!

– Настройки оптимизатора:• optimizer_search_depth• optimizer_prune_level• optimizer_switch

Page 18: Введение в отладку производительности MySQL приложений

Параллельные запросы и транзакции

• Борьба за системные ресурсы• Виды блокировок, которые пользователь может

контролировать:– Уровень таблицы– Уровень строки– Metadata– Есть ещё постраничные, но они использовались только

одним движком

• Что пользователь контролировать может только относительно:– Блокировки, несвязанные непосредственно с

обрабатываемыми данными, такие как query cache, блокировки на уровне движка и т.п.

Page 19: Введение в отладку производительности MySQL приложений

Параллельные запросы и транзакции:как вычислить

• Универсальное средство:– PROCESSLIST,

PERFORMANCE_SCHEMA.EVENTS_STAGES_%• Locked• Waiting for *

• На уровне движка:– SHOW ENGINE INNODB STATUS– Таблицы INNODB_* в INFORMATION SCHEMA

• INNODB_TRX, INNODB_LOCKS, INNODB_LOCK_WAITS

• Performance Schema– METADATA_LOCKS, TABLE_HANDLES– EVENTS_TRANSACTIONS

5.7

Page 20: Введение в отладку производительности MySQL приложений

Параллельные запросы и транзакции:средства InnoDB

• Мониторы– SHOW ENGINE INNODB STATUS – Опция innodb­status­file

– innodb_status_output

– innodb_status_output_locks• Больше информации о блокировках• Всегда включайте!

• TRANSACTIONS

5.6.16

Page 21: Введение в отладку производительности MySQL приложений

Параллельные запросы и транзакции:средства InnoDB

• Таблицы Information Schema– INNODB_TRX, INNODB_LOCK_WAITS

• mysql> SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, BLOCKING_TRX_ID, BLOCKING_LOCK_ID, TRX_QUERY FROM INNODB_TRX JOIN INNODB_LOCK_WAITS on (INNODB_TRX.TRX_ID = INNODB_LOCK_WAITS.REQUESTING_TRX_ID) WHERE TRX_STATE = 'LOCK WAIT'\G

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

• TRX_ID: C2F

• TRX_REQUESTED_LOCK_ID: C2F:0:1352:2

• BLOCKING_TRX_ID: C2C

• BLOCKING_LOCK_ID: C2C:0:1352:2

• TRX_QUERY: update titles set title='Senior Engineer'

• where title='Senior Engineer'

• 1 row in set (0.01 sec)

– INNODB_METRICS

Page 22: Введение в отладку производительности MySQL приложений

Параллельные запросы и транзакции:блокировки метаданных• mysql> select OBJECT_NAME, LOCK_TYPE, LOCK_STATUS, OWNER_THREAD_ID from metadata_locks\G

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

•     OBJECT_NAME: t2

•       LOCK_TYPE: SHARED_WRITE

•     LOCK_STATUS: GRANTED

• OWNER_THREAD_ID: 20

• ...

• ********************** 5. row **********************

•     OBJECT_NAME: t2

•       LOCK_TYPE: EXCLUSIVE

•     LOCK_STATUS: PENDING

• OWNER_THREAD_ID: 21

...

Page 23: Введение в отладку производительности MySQL приложений

Параллельные запросы и транзакции:устранение проблем

• Краткосрочное– Выбрать наименее важную транзакцию и убить её

• KILL <MYSQL_THREAD_ID>

• Долгосрочное– Спланировать приложение так, чтобы конкурирующие

транзакции разнести по времени выполнения– Избегать длинных транзакций без необходимости– Если autocommit=0

• Использовать READ-ONLY транзакции• Закрывать транзакции после SELECT и ALTER

Page 24: Введение в отладку производительности MySQL приложений

Борьба за системные ресурсы

• Память• CPU• Диск• Сеть

Page 25: Введение в отладку производительности MySQL приложений

Память

• Диагностика– free– top– vmstat

• Проблемы– mysqld использует слишком мало памяти

• Буферы не настроены на высокую производительность• Система ограничивает ресурсы, которые доступны

mysqld– mysqld использует слишком много памяти

Page 26: Введение в отладку производительности MySQL приложений

Диск

• Диагностика– df– iostat– ls -l /proc/{PID_OF_MYSQLD}/fd

• Починка– Параметры InnoDB

• innodb_adaptive_flushing• innodb_doublewrite• innodb_flush_log_at_trx_commit• innodb_flush_method• innodb_io_capacity• innodb_max_dirty_pages_pct

•– Binary log

• Formats– ROW– STATEMENT– MIXED

• binlog_row_image• sync_binlog

Page 27: Введение в отладку производительности MySQL приложений

CPU

• Диагностика– top– iostat– ps

• Параллельность и количество ядер

innodb_thread_concurrency Execution time

1 7.8164

2 4.3959

4 2.5889

8 2.6708

16 3.4669

32 3.4235

Page 28: Введение в отладку производительности MySQL приложений

Сеть

• Важно!– Надёжность– Пропускная способность– Скорость

• Диагностика– ping– --log-warnings=2– tcpdump

• Послать большой (1G и больше) файл и мониторить

Page 29: Введение в отладку производительности MySQL приложений

Репликация

• Мастер– Медленная сеть– Потери при записи в binary log

• Disk IO• Блокировки

• Слэйв– IO thread

• То же, что и у мастера– SQL thread

• Один поток против нескольких на мастере• Взаимодействие с другой нагрузкой на mysqld слэйва

Page 30: Введение в отладку производительности MySQL приложений

Репликация: диагностика

• SHOW SLAVE STATUS• Performance Schema Replication Tables

– replication_connection_status• mysql> select SERVICE_STATE, RECEIVED_TRANSACTION_SET, LAST_ERROR_NUMBER from replication_connection_status\G

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

•            SERVICE_STATE: ON

• RECEIVED_TRANSACTION_SET:

• 9fa18fb7­d6f2­11e3­bc7e­a088b4923078:1

•        LAST_ERROR_NUMBER: 0

• 1 row in set (0.00 sec)– replication_execute_status

5.7

Page 31: Введение в отладку производительности MySQL приложений

Ссылки

• Одиночный запрос:– http://glebshchepa.blogspot.co.uk/2012/04/optimizer-new-explain-formatjson.html– http://www.slideshare.net/myxplain/powerful-explain-in-mysql-56– http://www.slideshare.net/SvetaSmirnova/troubleshooting-my-sqlperformanceaddons– http://www.slideshare.net/SvetaSmirnova/performance-schema-mysql

• Параллельные запросы и транзакции:– http://shop.oreilly.com/product/0636920021964.do– http://planet.mysql.com/entry/?id=643406– https://blogs.oracle.com/mysqlinnodb/entry/get_started_with_innodb_metrics

• Общие– http://dev.mysql.com/doc/refman/5.7/en/index.html– https://blogs.oracle.com/mysqlinnodb/– http://marcalff.blogspot.ru/

Page 32: Введение в отладку производительности MySQL приложений

?

Page 33: Введение в отладку производительности MySQL приложений

СПАСИБО!

Page 34: Введение в отладку производительности 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.