2. 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/
3. Percona Server?
Фокус разработки:
I прозрачность: дополнительная диагностика и счётчики
I управляемость: функции, облегчающие
администрирование
I производительность
4. 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
5. 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
7. 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
9. Percona Server 5.6
I kill idle trx
BEGIN
SELECT * FROM t;
SELECT SLEEP(100000000);
. . .
10. Percona Server 5.6
Fake changes
I быстрый разогрев replication slave “проигрыванием” живой
нагрузки
I читает страницы для INSERT / UPDATE / DELETE, но не
изменяет их
16. 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
18. 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
21. Percona Server 5.6
Utility user:
I может изменять значения системных переменных
I имеет доступ только к тем таблицам, к которым
разрешено в my.cnf
I может создавать/удалять пользователей (если разрешён
доступ к mysql.*)
22. Percona Server 5.6
поддержка FusionIO atomic writes:
I поддерживает atomic writes API на FusionIO устройствах
I порт из MariaDB
I делает InnoDB doublewrite buffer ненужным
I повышает производильность на запись до 43%
24. 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%’;
25. 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
26. Percona Server 5.6
Scalability metrics plugin:
I сколько запросов завершилось в интервал времени?
I сколько запросов выполняются сейчас?
I сумма времени выполнения запросов, включая те, которые
ещё выполняются
I общее время, когда сервер выполнял хотя бы один запрос
I реализовано как audit plugin
27. Percona Server 5.6
I Диагностика в SHOW ENGINE INNODB STATUS: мьютексы,
background threads, insert buffer, adaptive hash index, buffer
pool, redo log, transactions, . . .
28. Производительность:
I SSD часто требуют иного подхода для чтения/записи
данных
I память (NUMA встречается всё чаще)
I процессоры: больше “лошадиных сил”, но нужно уметь
ими пользоваться
29. Производительность:
/***********************************************************
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. */
30. Инструменты:
I PERFORMANCE_SCHEMA в 5.6
+:
I SQL интерфейс
I нет равных по возможностям инструментов
-:
I накладные расходы до 30% (Bug #68413)
I плохо документирована
I иногда требует рестарта сервера
I мало информации по мьютексам
I сложно использовать и настраивать (вспомогательные
утилиты, например http://www.markleith.co.uk/ps_helper/)
32. Инструменты
I OProfile
+:
I callgraph profiling
I annotated profiling
I сравнительно низкий overhead
I доступен на всех системах
I широкий спектр hardware events
–:
I не показывает мьютексы
34. Инструменты
I Poor Man’s Profiler
I http://poormansprofiler.org/
I Percona Toolkit: wget percona.com/get/pt-pmp
35. Инструменты
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 нужно знать код, чтобы прочитать
42. NUMA
Linux memory overcommit:
I память выделяется, только когда к ней обращаются
I при инициализации buffer pool нужно сделать memset()
43. 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
44. Типы нагрузок:
I CPU bound:
I активные данные в памяти
I только чтение
I I/O bound:
I обычно интенсивная запись
45. CPU-bound
I неэффективная работа с памятью и кэшем процессора
I плохая масштабируемость
I неэффективная реализация примитивов синхронизации
I затор на doublewrite buffer для read-only нагрузок в 5.6!
51. 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 пустой (т.е. если нет
других транзакций!)
55. 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
56. 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)
57. Buffer pool mutex split
I реализовано в Percona Server много лет назад
I всё ещё актуально для 5.6
58. 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
60. 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
61. log block checksums
Клиент: хотим загружать ˜130mil записей очень быстро
I LOAD DATA INFILE
I несколько потоков
I без secondary indexes
I много partitions
62. 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
63. 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
64. 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 исправления ошибок