Spec-Zone.ru › MySQL 5.7

14.21.5.3 Настройка производительности плагина InnoDB memcached

Поскольку использование InnoDB в сочетании с memcached подразумевает запись всех данных на диск, независимо от того, немедленно или позже, ожидается, что общая производительность будет несколько ниже, чем при использовании memcached в одиночку. При использовании плагина InnoDB memcached цель оптимизации операций memcached должна заключаться в достижении лучшей производительности, чем у эквивалентных операций SQL.

Тесты показывают, что запросы и операции (вставки, обновления и удаления), использующие интерфейс memcached, выполняются быстрее, чем традиционные операции SQL. Операции DML обычно демонстрируют более существенное улучшение. Поэтому рекомендуется в первую очередь адаптировать приложения с интенсивными операциями записи к использованию интерфейса memcached. Также следует рассмотреть возможность адаптации приложений с интенсивными операциями записи, использующих быстрые и лёгкие механизмы, но лишенные надёжности.

Адаптация запросов SQL

Типы запросов, наиболее подходящие для простых запросов GET, — это те, которые содержат один предикат или набор AND условий в операторе WHERE:

SQL:
SELECT col FROM tbl WHERE key = 'key_value';

memcached:
get key_value

SQL:
SELECT col FROM tbl WHERE col1 = val1 and col2 = val2 and col3 = val3;

memcached:
# Since you must always know these 3 values to look up the key,
# combine them into a unique string and use that as the key
# for all ADD, SET, and GET operations.
key_value = val1 + ":" + val2 + ":" + val3
get key_value

SQL:
SELECT 'key exists!' FROM tbl
  WHERE EXISTS (SELECT col1 FROM tbl WHERE KEY = 'key_value') LIMIT 1;

memcached:
# Test for existence of key by asking for its value and checking if the call succeeds,
# ignoring the value itself. For existence checking, you typically only store a very
# short value such as "1".
get key_value
Использование системной памяти

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

Сокращение избыточных операций ввода-вывода

InnoDB имеет ряд настроек, позволяющих выбрать баланс между высокой надёжностью при сбоях и объёмом накладных расходов при высоких нагрузках на запись. Например, можно установить innodb_doublewrite в значение 0 и innodb_flush_log_at_trx_commit в значение 2. Измерьте производительность при различных значениях параметра innodb_flush_method.

Примечание

innodb_support_xa устарел; ожидается его удаление в будущих версиях. Начиная с MySQL 5.7.10, поддержка двухфазного подтверждения в операциях XA всегда включена, и отключение innodb_support_xa больше не допускается.

Дополнительные способы уменьшения или настройки операций ввода-вывода для операций с таблицами см. в разделе 8.5.8 «Оптимизация ввода-вывода InnoDB на диск».

Сокращение накладных расходов транзакций

Значение по умолчанию 1 для daemon_memcached_r_batch_size и daemon_memcached_w_batch_size предназначено для максимальной надёжности результатов и безопасности хранимых или обновляемых данных.

В зависимости от типа приложения можно увеличить одно или оба эти значения, чтобы уменьшить накладные расходы при частых операциях. На загруженном сервере можно увеличить daemon_memcached_r_batch_size, зная, что изменения данных, внесённые через SQL, могут не стать видимыми для memcached немедленно (то есть, пока не обработано ещё get операций N). При обработке данных, где каждая операция записи должна надёжно сохраняться, оставьте daemon_memcached_w_batch_size в значении 1. Увеличивайте это значение при обработке большого количества обновлений, предназначенных только для статистического анализа, где потеря последних N обновлений при неожиданном выходе приемлема.

Например, представьте систему, которая контролирует движение транспорта по загруженной дороге, регистрируя данные примерно для 100 000 транспортных средств ежедневно. Если приложение подсчитывает различные типы транспортных средств для анализа транспортных потоков, изменение значения daemon_memcached_w_batch_size с 1 до 100 сокращает накладные расходы операций подтверждения на 99%. В случае сбоя теряется не более 100 записей, что может быть приемлемой погрешностью. Если вместо этого приложение выполняло автоматическое считывание платы за проезд для каждого автомобиля, вы бы установили daemon_memcached_w_batch_size в значение 1, чтобы гарантировать немедленное сохранение каждой записи о платеже на диск.

Из-за способа, которым InnoDB организует значения ключей memcached на диске, если вам нужно создать большое количество ключей, может быть быстрее отсортировать элементы данных по значению ключа в приложении и создать их в отсортированном порядке, чем создавать ключи в произвольном порядке.

Команда memslap, которая входит в стандартный дистрибутив memcached, но не включается в плагин daemon_memcached, может быть полезна для оценки различных конфигураций. Она также может быть использована для генерации выборочных пар ключ-значение, которые можно использовать в собственных тестах.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-memcached-tuning.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API