"Производительность mysql: что нового?"

36
Производительность MySQL: что нового ? Алексей Копытов

Upload: badoo-development

Post on 06-Jan-2017

13.501 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: "Производительность MySQL: что нового?"

Производительность MySQL:что нового?

Алексей Копытов

Page 2: "Производительность MySQL: что нового?"

Производительность MySQL: что нового?

Алексей Копытов

Page 3: "Производительность MySQL: что нового?"

О чём доклад?

обзор изменений производительности за ~2 годаальтернативы InnoDB (MyRocks, TokuDB)текущие проблемы

Page 4: "Производительность MySQL: что нового?"

MySQL 5.7!

GA версия выпущена 19 октября 2015г.качественный релизогромное количество новый функций и улучшений производительностиобзорный доклад по всем новым возможностям от Дмитрия Ленёва сегодня

Page 5: "Производительность MySQL: что нового?"

Скорость соединения

создание нового соединения стало быстрееособенно когда много клиентовsysbench connect:

Page 6: "Производительность MySQL: что нового?"

Производительность на read-only нагрузках

sysbench OLTP POINT_SELECT , 72 ядра (4x18-ядерных Intel Xeon E7-58800 v3):

работа по оптимизации началась ещё в 5.6дальнейшие улучшения масштабируемости в 5.7:

1.6 миллиона key/value запросов в секунду1.8 миллиона, если использовать prepared statements

нет записи в базу (не назначается и не записывается TRX_ID )оптимизации в MDL коде для DML запросов засчёт более дорогих DDL блокировокустранение THR_LOCK блокировок для InnoDB таблиц

Page 7: "Производительность MySQL: что нового?"

Производительность на read-only нагрузках

Read-only транзакции больше не нужно явно помечать:

в MySQL 5.6 требуется явное указание не-AUTOCOMMIT транзакций

START TRANSACTION READ ONLYSELECT ...;SELECT ...;COMMIT;

SQL

в MySQL 5.7 транзакции считаются read-only по умолчанию.

START TRANSACTION;SELECT ...;SELECT ...;COMMIT;

SQL

Page 8: "Производительность MySQL: что нового?"

Производительность на read-only нагрузках

sysbench OLTP RO, 72 ядра (4x18-ядерных Intel Xeon E7-58800 v3):

1M запросов (~70K OLTP_RO транзакций) в секунду

Page 9: "Производительность MySQL: что нового?"

Производительность на read-only нагрузках

Обычный Adaptive Hash Index:

Cекционированный Adaptive Hash Index

использует хэш для поиска по "популярным" значениям B-Tree ключейхэш при частых обновлениях становится узким местомобновления возможны даже при read-only нагрузке!

секционируем по index_idреализовано в XtraDB (<= 2009г.)аналогичная опция в MySQL 5.7 ( innodb_adaptive_hash_index_parts [=8])

Page 10: "Производительность MySQL: что нового?"

Производительность на read-only нагрузках

Оставшиеся проблемы с масштабируемостью:

Adaptive Hash Index

блокировки страниц в buffer pool (block lock)

bug #74954 "Inefficient InnoDB row stats implementation" и bug #79455 "Restoreget_sched_indexer_t in 5.7"

на IO-bound read-only нагрузках: fil_system->mutex

секционирование по index_id – не самый лучший вариантобещают полностью переписать в MySQL 8

мьютексы были переписаны в 5.7rwlock-и плохо масштабируются, обещают переписать в MySQL 8

cчётчики считанных/изменённых записей плохо масштабируются намногоядерных архитектурах

Page 11: "Производительность MySQL: что нового?"

Производительность на read-write нагрузках

убрали index lock:

меньше блокировок на log_sys->mutex

сброс страниц на диск (flushing)

блокировка на весь индекс, когда нужно изменить структуру деревав 5.7 блокировка только при конфликтующих изменениях

в основном для innodb_flush_log_at_trx_commit=2

несколько параллельных потоков ( innodb_page_cleaners=4 )оптимизации в адаптивном алгоритме

Page 12: "Производительность MySQL: что нового?"

Производительность на read-write нагрузках

Временные InnoDB таблицы в 5.7:

используются вместо MyISAM по умолчанию оптимизатором для внутреннихтаблицне генерируют записей в транзакционный журналотдельное табличное пространство ibtmp1 – пересоздаётся при старте"ослабленный" MVCCне используют doublewrite bufferбыстрее MyISAM в большинстве случаев

Page 13: "Производительность MySQL: что нового?"

Производительность на read-write нагрузках

Проблемы:

проблемы с масштабируемостью из-за неуспеващего флашингаdoublewrite в качестве «узкого места»innodb_log_write_ahead_size увеличивает write amplification приinnodb_flush_log_at_trx_commit=1

Page 14: "Производительность MySQL: что нового?"

Производительность на read-write нагрузках

Percona Server:

отдельные потоки для LRU flushingпараллельный doublewrite buffer:

Page 15: "Производительность MySQL: что нового?"

Производительность на read-write нагрузках

много улучшенийно есть куда стремитьсяработа кипит :)

Page 16: "Производительность MySQL: что нового?"

Новые системные переменные

innodb_buffer_pool_size теперь динамическая переменнаяinnodb_buffer_pool_dump_pct=25innodb_fill_factor=100 (для sorted index build)innodb_log_write_ahead_size=8192innodb_numa_interleave=offinnodb_page_cleaners=1

Page 17: "Производительность MySQL: что нового?"

Изменения в значениях по умолчанию

Системные переменные с новыми значениями по умолчанию в 5.7:

binlog_format=rowsync_binlog=1ssl=1innodb_buffer_pool_dump_at_shutdown=on иinnodb_buffer_pool_load_at_startup=oninnodb_checksum_algorithm=crc32innodb_log_buffer_size=16Minnodb_purge_threads=4table_open_cache_instances=16

Page 18: "Производительность MySQL: что нового?"

MyRocks и TokuDB

Page 19: "Производительность MySQL: что нового?"

MyRocks

движок хранения от Facebook на основе RocksDB (форк LevelDB от Google)LSM-деревья, оптимизирован на запись9 миллиардов запросов/сек в Facebookнизкий write amplification (SSD!)высокая компрессия (SSD!)

Page 20: "Производительность MySQL: что нового?"

MyRocks

Источник: Mark Callaghan, MyRocks, MongoRocks & RocksDB

Page 21: "Производительность MySQL: что нового?"

MyRocks

Источник: Mark Callaghan, MyRocks, MongoRocks & RocksDB

Page 22: "Производительность MySQL: что нового?"

Ограничения MyRocks

нет поддержки многих возможностей InnoDB

только бинарные правила сортировки (collations)нет в MariaDB/Perconaстабильность уровня "можно пробовать"

секционированиеonline DDLtransportable tablespacesвнешние ключигеометрические/полнотекстовые индексывиртуальные колонки

Page 23: "Производительность MySQL: что нового?"

TokuDB

разработка с 2007г."фрактальные" деревьяна самом деле B-Tree с расширениямиразрабатывается в Percona с 2015г.

Page 24: "Производительность MySQL: что нового?"

TokuDB

Фрактальные деревья:

накапливание отложенных изменений в корневых узлах индексов ипроталкиваниек листьям по мере заполнения

Page 25: "Производительность MySQL: что нового?"

TokuDB

Сильные стороны:

быстрее InnoDB при большом количестве индексовнесколько кластеризованных индексовинтенсивные нагрузки на запись, когда dataset > RAMэкономия места на диске за счёт продвинутой компрессии (SSD!)read-free репликация

Page 26: "Производительность MySQL: что нового?"

Ограничения TokuDBНет поддержки многих возможностей InnoDB:

проблема с чекпойнтами и стабильностью времени отклика (источник: percona.com/blog)

секционированиеonline DDLtransportable tablespacesвнешние ключигеометрические/полнотекстовые индексывиртуальные колонки

уникальные индексы – медленноSELECT -ы дорогиенизкие темпы разработки

Page 27: "Производительность MySQL: что нового?"

Текущие проблемы и будущие версииMySQL

Page 28: "Производительность MySQL: что нового?"

Однопоточная производительность

каждый мажорный релиз MySQL на ~5% медленее предыдущего (нолучшемасштабируется)серия публикаций от Mark Callaghan и Петра Зайцева

Page 29: "Производительность MySQL: что нового?"

Однопоточная производительность

Почему это важно:

производительность в 1 соединение == время откликапараллельность репликации ограниченаадминистративные задачи – как правило один потокв большинстве случаев сервер работает с небольшим количеством соединений

Page 30: "Производительность MySQL: что нового?"

Однопоточная производительность

Почему это сложно:

от версии к версии кода большебольше ветвелений, кэш-промахов и т. д.дробление блокировок ведёт к лучше масштабируемости, но болеемедленнойоднопоточной работенет "низковисящих фруктов"

Page 31: "Производительность MySQL: что нового?"

Однопоточная производительность

Почему это до сих пор проблема:

MariaDB работали в этом направлении, но о результатах ничего неизвестно

не приоритет для разработчиковнужно помочь приоритизироватьне стесняйтесь сообщать на http://bugs.mysql.com/, если для вас это тоже проблема

Page 32: "Производительность MySQL: что нового?"

Умная поддержка NUMA

Предыстория вопроса:

Twitter/Percona/MariaDB, 2012:

Jeremy Cole, 2010:The MySQL “swap insanity” problem and the effects of the NUMA architectureсбросить FS cacheвключить чередование страницобеспечить инициализацию страниц памяти при старта, а не в процессеработы

чередование страниц buffer pool + равномерное распределение между нодамиnuma_interleaveinnodb_buffer_pool_populateflush_caches

Page 33: "Производительность MySQL: что нового?"

Умная поддержка NUMA

Oracle MySQL, 2015:

innodb_numa_interleave – только частичное решение проблемыопция flush_caches оставлена в Percona Server 5.7

Page 34: "Производительность MySQL: что нового?"

Умная поддержка NUMA

проблема с NUMA не только в излишнем использовании swap.NUMA cache line contention:

многие структуры данных не используют чередование:bug #79358: No NUMA interleaving for some shared structures

"горячие" структуры данных в основном в одной NUMA нодеблокировки вызывают значительный трафик между нодами

внутренний словарь данных в InnoDBкэш табличных пространствбуфер транзакционного журналаи т.д.

Page 35: "Производительность MySQL: что нового?"

Умный параллельный purge

purge не справляется на нагрузках с очень интенсивной записьюнесколько purge потоков соревнуются за один и тот же индекснужно более "интеллектуальное" распределение задач между потокамиhttps://bugs.mysql.com/81368экспериментальный патч в Percona ~ 2013г.скорее всего полный редизайн в MySQL 8

Page 36: "Производительность MySQL: что нового?"

Спасибо! Вопросы?