18.10.2016 09:44
OlegON
 
В MySQL и MariaDB есть Query Cache или, если по-русски, кеш запросов. Очень значимая и полезная для сохранения ресурсов сервера вещь. Для понимания этой значимости, могу привести пример этого сервера, где выключение query cache привело к возрастанию нагрузки на процессор почти втрое.

Итак, как настраивать Query Cache:
Код:
cat /etc/mysql/my.cnf | grep query_c | sort
query_cache_limit = 256K
query_cache_min_res_unit = 512
query_cache_size = 32M
query_cache_type = ON
для того, чтобы включить кеширование, необходимо query_cache_type выставить в ON или DEMAND, после чего задать query_cache_size отличным от нуля. Обратите внимание, что размер кеша более 256Мб создает трудности процессору по управления таким большим массивом и поиску в нем. Необходимо соблюсти определенный баланс между тем, чтобы кеш был не слишком велик и тем, чтобы его хватало.

Для того, чтобы "лишние" запросы, которые повторяются редко, не попадали в кеш и не замусоривали его, их необходимо сопроводить подсказкой SQL_NO_CACHE. Например
SQL код:
select SQL_NO_CACHE column from table
Для того, чтобы в режиме DEMAND принудительно запихивать запрос в кеш, необходимо использовать подсказку SQL_CACHE.

Чтобы ограничить размер попадающих в кеш результатов, задайте параметры query_cache_limit и query_cache_min_res_unit, первый обозначает максимальный размер выдаваемой под один результат запроса памяти, второй - минимальный размер под возвращаемый результат. Тут все, опять же, зависит от использования СУБД, у меня, например, гора маленьких результатов, а больших не бывает никогда. Поскольку выделение памяти всегда сказывается на общем времени операции, я предпочел маленький минимальный порог и маленький верхний.
18.10.2016 09:50
OlegON
 
Как анализировать состояние кеша (два запроса с интервалом в секунду)
Код:
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Qcache_free_blocks      | 1038   |
| Qcache_free_memory      | 842568 |
| Qcache_hits             | 63364  |
| Qcache_inserts          | 79822  |
| Qcache_lowmem_prunes    | 10256  |
| Qcache_not_cached       | 3116   |
| Qcache_queries_in_cache | 5359   |
| Qcache_total_blocks     | 21116  |
+-------------------------+--------+
8 rows in set (0.00 sec)

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Qcache_free_blocks      | 1026   |
| Qcache_free_memory      | 806976 |
| Qcache_hits             | 63505  |
| Qcache_inserts          | 79971  |
| Qcache_lowmem_prunes    | 10256  |
| Qcache_not_cached       | 3116   |
| Qcache_queries_in_cache | 5381   |
| Qcache_total_blocks     | 21149  |
+-------------------------+--------+
необходимо стремиться к тому, чтобы Qcache_free_blocks было ближе к нулю, как и свободная память в кеше. Скорее всего, это вам не удастся, поскольку фрагментация кеша будет этому мешать. Для борьбы можно предложить только уменьшить минимальный размер блока и не помещать в кеш выпадающие из него запросы.

Как видим на примере, кеш заполняется, выпадания запросов по нехватке памяти нет, количество хитов достаточно высокое по отношению к количеству выкинутых запросов, все достаточно сбалансировано.
Часовой пояс GMT +3, время: 01:00.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.