• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Kopytov
 

Kopytov

on

  • 1,705 views

MySQL user group

MySQL user group

Statistics

Views

Total Views
1,705
Views on SlideShare
662
Embed Views
1,043

Actions

Likes
0
Downloads
5
Comments
0

3 Embeds 1,043

http://tech.yandex.ru 829
http://events.yandex.ru 159
https://tech.yandex.ru 55

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Kopytov Kopytov Presentation Transcript

    • Percona Server 5.6 Alexey.Kopytov@percona.com August 2, 2013
    • Percona Server? I расширенная версия (не форк!) MySQL I последний релиз MySQL + набор расширений I расширения основаны на запросах от клиентов и консультантов Percona I 30,000 - 60,000 загрузок в месяц с percona.com I скоро в репозиториях Debian (потом Ubuntu) I http://mirror.yandex.ru/mirrors/percona/
    • Percona Server? Фокус разработки: I прозрачность: дополнительная диагностика и счётчики I управляемость: функции, облегчающие администрирование I производительность
    • Percona Server -> MySQL 5.6 Функции Percona Server, реализованные в MySQL 5.6: I InnoDB persistent statistics I поддержка redo log > 4 GB I INFORMATION_SCHEMA.INNODB_SYS_* таблицы I INFORMATION_SCHEMA.BUFFER_POOL I innodb_page_size I InnoDB fast page checksums – innodb_checksum_algorithm в 5.6 I improved InnoDB tablespace import – экспорт таблиц прямо на сервере в 5.6 I LRU dump/restore – innodb_buffer_pool_load_at_startup в 5.6 I innodb_dict_size_limit – table_definition_cache в 5.6
    • Percona Server 5.6 I Релиз: сентябрь (2013) I Расширения: userstat, расширения slow query log, corrupt_table_action, kill idle, trx, fake changes, expand_fast_index_creation, mysqldump --innodb-optimize-keys, innodb_log_block_size, innodb_flush_method, trx descriptors, buffer pool mutex split, adaptive hash index mutex split, dynamic row format в MEMORY storage engine, патчи для NUMA архитектуры, enforce storage engine, utility user, поддержка FusionIO atomic writes, временные таблицы в INFORMATION_SCHEMA, query cache strip comments, max_statement_time, scalability metrics plugin, диагностика в SHOW ENGINE INNODB STATUS
    • Percona Server 5.6 I userstat – PERFORMANCE_SCHEMA не является полной заменой
    • Percona Server 5.6 I расширения для slow query log # User@Host: mailboxer[mailboxer] @ [192.168.10.165] # Thread_id: 11167745 Schema: board # Query_time: 1.009400 Lock_time: 0.000190 Rows_sent: 4 R # Bytes_sent: 278 Tmp_tables: 0 Tmp_disk_tables: 0 Tmp_ta # InnoDB_trx_id: 1500 # QC_Hit: No Full_scan: Yes Full_join: No Tmp_table: No # Filesort: No Filesort_on_disk: No Merge_passes: 0 # InnoDB_IO_r_ops: 6415 InnoDB_IO_r_bytes: 105103360 Inn # InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000 # InnoDB_pages_distinct: 6430 SET timestamp=1346844943; SELECT id,title,production_year FROM title WHERE title = ’Ba
    • Percona Server 5.6 I corrupt_table_action
    • Percona Server 5.6 I kill idle trx BEGIN SELECT * FROM t; SELECT SLEEP(100000000); . . .
    • Percona Server 5.6 Fake changes I быстрый разогрев replication slave “проигрыванием” живой нагрузки I читает страницы для INSERT / UPDATE / DELETE, но не изменяет их
    • Percona Server 5.6 I expand_fast_index_creation
    • Percona Server 5.6 I mysqldump --innodb-optimize-keys
    • Percona Server 5.6 I innodb_log_block_size
    • Percona Server 5.6 I innodb_flush_method
    • Percona Server 5.6 I trx descriptors
    • Percona Server 5.6 Buffer pool mutex split. I MySQL: глобальный мьютекс I Percona Server: I buf_pool_mutex I LRU_list_mutex I flush_list_mutex I page_hash_latch I free_list_mutex I zip_free_mutex I zip_hash_mutex
    • Percona Server 5.6 Adaptive hash index partitioning I innodb_adaptive_hash_index_partitions
    • Percona Server 5.6 I dynamic row format в MEMORY storage engine CREATE TABLE t (a VARCHAR(255)) ENGINE=MEMORY; I MySQL: 255+ байтов на запись I Percona Server: зависит от действительной длины каждой записи I Percona Server: поддерживает BLOB/TEXT
    • Percona Server 5.6 I NUMA патчи
    • Percona Server 5.6 I enforce storage engine mysql> select @@enforce_storage_engine; +--------------------------+ | @@enforce_storage_engine | +--------------------------+ | innodb | +--------------------------+ mysql> create table t(a int) engine=myisam; ERROR 1286 (42000): Unknown storage engine ’MyISAM’
    • Percona Server 5.6 Utility user: I может изменять значения системных переменных I имеет доступ только к тем таблицам, к которым разрешено в my.cnf I может создавать/удалять пользователей (если разрешён доступ к mysql.*)
    • Percona Server 5.6 поддержка FusionIO atomic writes: I поддерживает atomic writes API на FusionIO устройствах I порт из MariaDB I делает InnoDB doublewrite buffer ненужным I повышает производильность на запись до 43%
    • Percona Server 5.6 I временные таблицы в INFORMATION_SCHEMA
    • Percona Server 5.6 I query cache strip comments /* comment 1 */ select * from users where name like ’Bob%’; /* comment 2 */ select * from users where name like ’Bob%’;
    • Percona Server 5.6 I max_statement_time из Twitter MySQL: mysql> SET max_statement_time=1000; mysql> SELECT SLEEP(2); ERROR: Query execution was interrupted, max_statement_time exceeded I модификация в Percona Server: mysql> SET STATEMENT max_statement_time=60000 SELECT * FROM big_table; ERROR: Query execution was interrupted, max_statement_time exceeded
    • Percona Server 5.6 Scalability metrics plugin: I сколько запросов завершилось в интервал времени? I сколько запросов выполняются сейчас? I сумма времени выполнения запросов, включая те, которые ещё выполняются I общее время, когда сервер выполнял хотя бы один запрос I реализовано как audit plugin
    • Percona Server 5.6 I Диагностика в SHOW ENGINE INNODB STATUS: мьютексы, background threads, insert buffer, adaptive hash index, buffer pool, redo log, transactions, . . .
    • Производительность: I SSD часто требуют иного подхода для чтения/записи данных I память (NUMA встречается всё чаще) I процессоры: больше “лошадиных сил”, но нужно уметь ими пользоваться
    • Производительность: /*********************************************************** Runs an idle loop on CPU. The argument gives the desired delay in microseconds on 100 MHz Pentium + Visual C++. */ ... /* Semaphore operations in operating systems are slow: Solaris on a 1993 Sparc takes 3 microseconds (us) for a lock-unlock pair and Windows NT on a 1995 Pentium takes 20 microseconds for a lock-unlock pair. */
    • Инструменты: I PERFORMANCE_SCHEMA в 5.6 +: I SQL интерфейс I нет равных по возможностям инструментов -: I накладные расходы до 30% (Bug #68413) I плохо документирована I иногда требует рестарта сервера I мало информации по мьютексам I сложно использовать и настраивать (вспомогательные утилиты, например http://www.markleith.co.uk/ps_helper/)
    • Инструменты INFORMATION_SCHEMA.INNODB_METRICS в 5.6 +: I дополняет PERFORMANCE_SCHEMA I низкие накладные расходы I не требует рестарта -: I плохо документирована I оригинальный способ конфигурации
    • Инструменты I OProfile +: I callgraph profiling I annotated profiling I сравнительно низкий overhead I доступен на всех системах I широкий спектр hardware events –: I не показывает мьютексы
    • Инструменты I perf +: I похож на OProfile I perf top -: I показывает только системные мьютексы (pthread)
    • Инструменты I Poor Man’s Profiler I http://poormansprofiler.org/ I Percona Toolkit: wget percona.com/get/pt-pmp
    • Инструменты I Poor Man’s Profiler 300 select,os_thread_sleep,srv_LRU_dump_restore_thread,start_th 157 pthread_cond_wait,os_cond_wait,os_event_wait_low,sync_array 147 pthread_cond_wait,os_cond_wait,os_event_wait_low,srv_purge_ 139 select,os_thread_sleep,srv_purge_thread,start_thread,clone 104 pthread_cond_wait,os_cond_wait,os_event_wait_low,sync_array 78 ut_delay,mutex_spin_wait,mutex_enter_func,pfs_mutex_enter_f +: I доступен всегда и везде I позволяет получить общую картину быстро с минимальными усилиями -: I высокий overhead I низкая точность I нужно знать код, чтобы прочитать
    • Визуализация: I dim_stat I Percona Monitoring Plugins – интеграция Nagios и Cacti
    • NUMA Uniform Memory Accessc vs Non-Uniform Memory Access:
    • NUMA I всегда есть обращения к “чужой” памяти
    • NUMA I память выделяется на текущей ноде по умолчанию
    • NUMA I чередование (interleaving) памяти: # Numactl --interleave all mysqld ... I interleaving на уровне BIOS – плохо!
    • NUMA I файловый кэш тоже мешает: I решение: # sysctl -q -w vm.drop_caches=3
    • NUMA Linux memory overcommit: I память выделяется, только когда к ней обращаются I при инициализации buffer pool нужно сделать memset()
    • NUMA I Подробное описание проблем от Jeremy Cole: http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the- numa-architecture/ http://blog.jcole.us/2012/04/16/a-brief-update-on-numa-and- mysql/ Патчи от Twitter в Percona Server 5.5 / 5.6: I опции mysqld_safe: [mysqld_save] numa_interleave=1 flush_caches=1 I опции сервера: [server] innodb_buffer_pool_populate=1
    • Типы нагрузок: I CPU bound: I активные данные в памяти I только чтение I I/O bound: I обычно интенсивная запись
    • CPU-bound I неэффективная работа с памятью и кэшем процессора I плохая масштабируемость I неэффективная реализация примитивов синхронизации I затор на doublewrite buffer для read-only нагрузок в 5.6!
    • jemalloc I масштабируемая реализация malloc() http://www.canonware.com/jemalloc/ I используется по умолчанию в Firefox, FreeBSD, NetBSD
    • jemalloc I поставляется вместе с Percona Server (.tar.gz) I опция malloc-lib: [mysqld_save] malloc-lib=/usr/local/mysql/lib/libjemalloc.so
    • kernel mutex и trx sys->mutex I read views:
    • kernel mutex и trx sys->mutex I read views:
    • kernel mutex и trx sys->mutex I создание read view:
    • kernel mutex и trx sys->mutex read-only транзакции в 5.6: I SELECT + AUTO_COMMIT=1 или START TRANSACTION READ ONLY I read-only транзакции не добавляются в trx_list I нет проблемы, если trx_list пустой (т.е. если нет других транзакций!)
    • trx descriptors
    • trx descriptors
    • trx descriptors
    • kernel mutex и trx sys->mutex Как узнать? I SHOW ENGINE INNODB STATUS: --Thread 140370743510784 has waited at trx0trx.c line 1184 f Mutex at 0x2b0ccc8 ’&kernel_mutex’, lock var 1 ... I PMP: 234 ... innobase_commit_low,thd=0xad553dc0),innobase_commit. I PERFORMANCE_SCHEMA: = Что делать? I попробовать jemalloc I использовать read-only транзакции, если есть возможность I перейти на Percona Server или MariaDB + XtraDB
    • I/O bound I часто медленнее в 5.6 (часть регрессий исправлена в 5.6.13) I плохая согласованность подсистем InnoDB (user threads, log writing, flushing, purge, . . . ) I несколько buffer pool-ов чаще мешают, чем помогают (Bug #67808) I затор на всевозможных механизмах синхронизации I doublewrite работает неэффективно для страниц < 16K (Bug #69842)
    • Buffer pool mutex split I реализовано в Percona Server много лет назад I всё ещё актуально для 5.6
    • AHI mutex partitioning Adaptive hash index: I строится автоматически для часто обращаемых страниц B-Tree индексов I глобальная структура Как определить AHI mutex contention? I btr_search... в PMP I wait/synch/rwlock/innodb/hash_table_locks в PERFORMANCE_SCHEMA Что делать? I Percona Server: innodb_adaptive_hash_index_partitions=N
    • AHI mutex partitioning
    • index lock I 2 механизма обновления B-Tree индексов: I оптимистический – страница обновляется “по месту” I пессимистический – реорганизация страниц => блокировка всей таблицы! I может читать страницы с диска, пока индекс заблокирован I Как узнать? I PMP: btr_cur_search_to_nth_level() I PERFORMANCE_SCHEMA: &new_index->lock I Что делать? I использовать partitioning
    • log block checksums Клиент: хотим загружать ˜130mil записей очень быстро I LOAD DATA INFILE I несколько потоков I без secondary indexes I много partitions
    • log block checksums Затор на log_sys->mutex: ulint log_block_calc_checksum( const byte* block) /*!< in: log block */ { for (i = 0; i < OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_TRL_SIZE; i++ ulint b = (ulint) block[i]; sum &= 0x7FFFFFFFUL; sum += b; sum += b << sh; sh++; if (sh > 24) { sh = 0; } } return(sum); } I замена алгоритма на векторную CRC32 инструкцию процессора => ˜2x speedup
    • log block checksums I Как узнать? I PERFORMANCE_SCHEMA: log_sys->mutex I PMP: 33 log_block_calc_checksum,log_block_store_checksum,log_ Что делать? I дождаться innodb_log_checksum_algorithm в Percona Server 5.6
    • Threadpool I реализация в MySQL 6.0 I libevent I глобальный мьютекс I блокированное соединение оставалось в пуле I реализация в MySQL Enterprise Edition I реализована как plugin I $$ I реализация в MariaDB I независимая реализация I не plugin (но использует инфрастуктуру enterprise plugin) I реализация в Percona I портирована из MariaDB I high priority scheduling I исправления ошибок
    • Threadpool