Разделенный кэш ключей
О разделенном кэше ключей
Разделенный кэш ключей представляет собой набор структур для обычного кэша ключей MyISAM, называемых сегментами кэша ключей. Разделенный кэш ключей устраняет одну из основных проблем простого кэша ключей: конфликт потоков при блокировке кэша ключей (мьютексе). При использовании обычных кэшей ключей каждая функция интерфейса кэша ключей должна получить эту блокировку. Таким образом, потоки конкурируют за эту блокировку даже в том случае, когда они получили общие блокировки для файла и страницы, которые они хотят прочитать из буферов кэша ключей.
При работе с разделенным кэшем ключей любая функция интерфейса кэша ключей, которой требуется только одна страница, должна получить блокировку кэша ключей только для сегмента, к которому назначена страница. Это увеличивает вероятность того, что потоки не будут конкурировать за одну и ту же блокировку кэша ключей.
Любая страница из файла может быть помещена в буфер только одного сегмента. Номер сегмента рассчитывается по номеру файла и позиции страницы в файле, и он всегда одинаков для страницы. Страницы равномерно распределяются между сегментами.
Идея и исходный код разделенного кэша ключей были предоставлены Фредриком Ньландером из Stardoll.com. Код был значительно переработан, улучшен и в конечном итоге интегрирован в MariaDB Игорем Бабаевым из Monty Program (сейчас MariaDB Corporation).
Вы можете найти результаты некоторых бенчмарков, сравнивающих различные настройки на странице Производительность разделенного кэша ключей.
Синтаксис разделенного кэша ключей
Новая глобальная переменная: key_cache_segments. Эта переменная задает количество сегментов в кэше ключей. Допустимые значения для этой переменной — целые числа от 0 до 64. Если число сегментов установлено на значение, большее 64, количество сегментов будет усечено до 64, и будет выведено сообщение об ошибке.
Значение 0 означает, что кэш ключей является обычным (то есть не разделенным) кэшем ключей. Это значение по умолчанию. Если key_cache_segments равно 1 (или выше), используется новый код сегментации кэша ключей. На практике нет практического использования разделенного кэша ключей с одним сегментом, за исключением целей тестирования, и установка key_cache_segments = 1 должна быть медленнее, чем любой другой вариант, и не должна использоваться в рабочей среде.
Другие глобальные переменные, используемые при работе с обычными кэшами ключей, также применяются к разделенным кэшам ключей: key_buffer_size, key_cache_age_threshold, key_cache_block_size и key_cache_division_limit.
Статистика разделенного кэша ключей
Статистику о кэше ключей можно найти, посмотрев на таблицу KEY_CACHES в базе данных INFORMATION_SCHEMA. Столбцы в этой таблице:
| Имя столбца | Описание |
|---|---|
KEY_CACHE_NAME |
Имя кэша ключей |
SEGMENTS |
общее количество сегментов (установлено в NULL для обычных кэшей ключей) |
SEGMENT_NUMBER |
номер сегмента (установлено в NULL для всех обычных кэшей ключей и для строк, содержащих статистику агрегации для разделенных кэшей ключей) |
FULL_SIZE |
память для буферов кэша/вспомогательных структур |
BLOCK_SIZE |
размер блоков |
USED_BLOCKS |
количество используемых блоков |
UNUSED_BLOCKS |
количество неиспользуемых блоков |
DIRTY_BLOCKS |
количество грязных блоков |
READ_REQUESTS |
количество запросов на чтение |
READS |
количество фактических чтений из файлов в буферы |
WRITE_REQUESTS |
количество запросов на запись |
WRITES |
количество фактических записей из буферов в файлы |
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/segmented-key-cache/