Оптимизация table_open_cache
table_open_cache может быть полезной переменной для настройки с целью повышения производительности.
Каждый одновременный сеанс доступа к одной и той же таблице делает это независимо. Это повышает производительность, хотя и сопряжено с дополнительными затратами на использование памяти.
table_open_cache указывает максимальное количество таблиц, которое сервер может держать открытыми в одном экземпляре кэша таблиц. В идеале, это значение должно быть таким, чтобы повторное открытие таблицы происходило как можно реже.
Однако обратите внимание, что это не жёсткий лимит. Когда серверу требуется открыть таблицу, он вытесняет наименее используемую закрытую таблицу из кэша и добавляет новую. Если все таблицы используются, сервер добавляет новую таблицу и не вытесняет ни одну таблицу. Как только таблица больше не используется, она будет вытеснена из списка, даже если никакой таблице не нужно открываться, пока число открытых таблиц не станет равно table_open_cache.
table_open_cache по умолчанию равен 2000 с MariaDB 10.1.7. До этого значение по умолчанию было 400.
Вы можете посмотреть текущее значение в файле my.cnf или выполнив:
select @@table_open_cache; +--------------------+ | @@table_open_cache | +--------------------+ | 400 | +--------------------+
Чтобы оценить, можно ли использовать более высокое значение table_open_cache, обратите внимание на количество открытых таблиц в сочетании с временем активности сервера (Opened_tables и Uptime статусные переменные):
show global status like 'opened_tables'; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | Opened_tables | 354858 | +---------------+--------+
Если число открытых таблиц быстро увеличивается, вам следует увеличить значение table_open_cache. Постарайтесь найти значение, при котором количество открытых таблиц увеличивается медленно или, возможно, вообще не увеличивается.
Убедитесь, что ваша операционная система может справиться с количеством открытых дескрипторов файлов, необходимых для настройки table_open_cache. Если table_open_cache установлен слишком высоко, MariaDB может начать отклонять подключения, поскольку операционная система исчерпывает дескрипторы файлов. Также обратите внимание, что хранилища MyISAM (и Aria?) требуют два дескриптора файла на каждую открытую таблицу.
Возможно, значение open_table_cache можно даже уменьшить.
Если количество открытых таблиц (open_tables) еще не достигло значения table_open_cache_size, а сервер работал некоторое время, вы можете уменьшить это значение.
show global status like 'open_tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 354 | +---------------+-------+
Кэш открытых таблиц можно очистить с помощью FLUSH TABLES или с помощью команд flush-tables или refresh mariadb-admin.
Автоматическое создание новых экземпляров кэша открытых таблиц
Сервер MariaDB может создавать несколько экземпляров кэша открытых таблиц. Изначально он создаёт только один экземпляр. Однако, всякий раз, когда он обнаруживает конфликт на существующих экземплярах, он автоматически создаёт новый экземпляр. Когда количество экземпляров увеличивается из-за конфликтов, оно не уменьшается снова.
Когда сервер MariaDB создаёт новый экземпляр, он печатает сообщение, подобное следующему, в журнал ошибок:
[Note] Detected table cache mutex contention at instance 1: 25% waits. Additional table cache instance activated. Number of instances after activation: 2.
Максимальное количество экземпляров определяется системной переменной table_open_cache_instances. Значение по умолчанию для системной переменной table_open_cache_instances равно 8, что ожидается для обработки до 100 ядер процессора. Если ваша система больше, то вам может быть выгодно увеличить значение этой системной переменной.
В зависимости от соотношения фактически доступных дескрипторов файлов и размера table_open_cache, максимальное количество экземпляров может быть автоматически скорректировано до меньшего значения при запуске сервера.
Реализация и поведение этой функции отличается от аналогичной функции в MySQL 5.6.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/optimizing-table_open_cache/