Перейти к содержанию

Кеширование

Производительность

При большом объеме базы данных может возникнуть проблема производительности. Связано это со следующими причинами:

  • обращения к этому массиву информации на чтение или на запись порождают конкурентные запросы;
  • запросы сами по себе быстрые, но их такое число, что БД начинает выстраивать из них очередь;
  • запросы медленные и тяжёлые, и к тому же очень частые.

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

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

Если в качестве примера брать интернет-магазин, то для каждого товара будет создан файл в кеше, чтобы при следующем обращении покупателя сервер не напрягался с запросами к БД. Это и позволяет запускать магазины уровня Эльдорадо.

Кеширование

Кеширование - технология, позволяющая сохранять результаты работы редко обновляемых и ресурсоемких кусков кода (например, активно работающих с базой данных) в специальном хранилище для более быстрого доступа к ним.

Для реализации этого созданы классы:

  • Cache - финальный класс для кеширования PHP переменных и HTML результата выполнения скрипта. В старом ядре есть классы:- CPageCache - класс для кеширования HTML результата выполнения скрипта;
  • CPHPCache - класс для кеширования PHP переменных и HTML результата выполнения скрипта.

Система Bitrix Framework включают в себя разные технологии кеширования:

  • Кеширование компонентов (или Автокеширование) - все динамические компоненты, которые используются для создания веб-страниц, имеют встроенную поддержку управления кешированием.

Для использования этой технологии достаточно включить автокеширование одной кнопкой на административной панели. При этом все компоненты, у которых был включен режим автокеширования, создадут кеши и полностью перейдут в режим работы без запросов к базе данных. - Неуправляемое кеширование - возможность задать правила кеширования ресурсоемких частей страниц. Результаты кеширования сохраняются в виде файлов в каталоге /bitrix/cache/ или в произвольной папке root_directory

По умолчанию корневая папка файлового кеша — /bitrix/cache/. С версии 24.100.0 главного модуля ее можно заменить на произвольную папку 'root_directory'.
Настройка параметров ядра , заданной в .settings.php. Если время кеширования не истекло, то вместо ресурсоемкого кода будет подключен предварительно созданный файл кеша.

Кеширование называется неуправляемым, поскольку кеш не перестраивается автоматически после модификации исходных данных, а действует указанное время после создания, которое задается в диалоге Параметры компонента.

Правильное использование кеширования позволяет увеличить общую производительность сайта на порядок. Однако необходимо учитывать, что неразумное использование кеширования может привести к серьезному увеличению размера каталога /bitrix/cache/. - Управляемый кеш - автоматически обновляет кеш компонентов при изменении данных. Для часто обновляемого большого массива данных использование управляемого кеша неоправданно. - HTML кеш лучше всего включить на какой-нибудь редко изменяющийся раздел с регулярным посещением анонимных посетителей. Технология проста в эксплуатации, не требует от пользователя отслеживать изменения, защищает дисковой квотой от накрутки данных и самовосстанавливает работоспособность при превышении квоты или изменении данных. (Считается устаревшей, рекомендуется использовать технологию Композитный сайт.) В плане многосайтовости поддерживает только многосайтовость на одном домене. - Кеширование меню. Для кеширования меню применяется специальный алгоритм, который учитывает тот факт, что большая часть посетителей - это незарегистрированные пользователи.

Кеш меню управляемый и обновляется при редактировании меню или изменении прав доступа к файлам и папкам через административный интерфейс и API.

Основные настройки кеширования расположены на странице Настройки кеширования (Настройки > Настройки продукта > Автокеширование).

Примечание: В ядре D7 настройки кеширования производятся в специальном файле.

Блокирующий режим в системе кеширования

Что такое «блокирующий режим» кеширования

С версии main 24.0.0 в кешировании появился «блокирующий режим». В таком режиме:

  • кеш создается только одним потоком (например, хиты пользователей)
  • остальные потоки получают старое значение кеша, пока новое значение не будет сгенерировано
  • если старого значения нет, то каждый поток генерирует данные, как обычно

В ряде случаев такой подход сильно снижает нагрузку — смотрите ниже пример нагрузочного теста.

Пример нагрузочного теста
Нагрузочный тест на портале: авторизация на пустой странице и открытие страницы с компонентом списков новостей с небольшим временем жизни кеша. В обычном режиме видим пики времени генерации, низкий общий rps и пики ошибок: Нажмите на рисунок, чтобы увеличить) В «блокирующем режиме» видим более стабильное время генерации, более высокий rps, большее количество хитов, меньшее время генерации: Нажмите на рисунок, чтобы увеличить)

Когда работает «блокирующий режим»

«Блокирующий режим» сработает автоматически, если выполнено хотя бы одно из условий:

  • Кеш истек: если кеш устарел, но прошло не больше определенного времени с момента его истечения
  • Кеш был удален: если кеш был удален по ключу, но прошло не больше 60 секунд (это время можно настроить)
// Удаление кеша по ключу с сохранением старого значения
$cache = Bitrix\Main\Data\Cache::createInstance(['actual_data' => false]);
$cache->clean($key, $dir);

// Создание кеша с поддержкой работы со старыми ключами
$cache = Bitrix\Main\Data\Cache::createInstance(['actual_data' => false]);

Чтобы все обращения к кешу были в блокирующем режиме, укажите use_lock => true:

// Memcache
    'cache' => [
        'value' => [
            'type' => [
                'class_name' => '\\Bitrix\\Main\\Data\\CacheEngineMemcache',
                'extension' => 'memcache'
            ],

            'memcache' => ['host' => '127.0.0.1', 'port' => '11211',],
            'use_lock' => true,

            // 'servers' => [
            //    0 => ['host' => '127.0.0.1', 'port' => 11211, 'weight' => 1],
            //    1 => ['host' => '10.100.0.59', 'port' => 11211, 'weight' => 1],
            //    2 => ['host' => 'unix:///var/run/memcached/memcached.sock', 'port' => '0'],
            //],

            'sid' => 'bxMemcache'
        ]
    ],

Когда работает обычный механизм кеширования

Обычный механизм кеширования работает в следующих случаях:

  • кеш создан или очищен без указания параметра ['actual_data' => false]
  • кеш истек по времени больше, чем на заданное время ttl * $ttlMultiplier
  • кеш очищен по тегу или по папке
  • кеш очищен по ключу, но с момента его удаления прошло более 60 секунд

Примечание: по умолчанию компоненты поддерживают работу в «блокирующем режиме».

Список ссылок по теме