В обычном режиме кэш хранится на диске в файловой системе, но бывают случаи, когда это становится нецелесообразным и сложным.
Рассмотрим ситуацию, когда диски дорогие и маленького объёма, такие как ssd,nvme, а кэша образуется больше 100 Гб. Такую картину, например, можно наблюдать у многих решений Аспро и Битрикс, когда образуется большое количество файлового кэша, особенно если у вас торговые предложения. В нашей практике были случаи, когда у клиента за пять дней образовалось 400 Гб. Сложно представить, сколько он платил за хранение такого объёма на nvme диске.
Итак, какой выход в подобных ситуациях? Добавить на сервер оперативную память и хранить кэш там. Memcache эффективней и удобнее, чем файловый кэш.
Чтобы использовать в проекте memcached, необходимо произвести его настройку в соответствии с предполагаемой нагрузкой.
Для стандартной настройки необходимо:
- В файле /etc/sysconfig/memcached задать следующие параметры:
MAXCONN = "1024" - количество одновременных подключений (по умолчанию 1024);
CACHESIZE="1024" - объем выделяемой памяти для кеша (по умолчанию 64MB);
OPTIONS="-t 8" - количество потоков memcached (по умолчанию 4).
Примечание: Параметры MAXCONN, CACHESIZE и OPTIONS подбираются экспериментальным путем в зависимости от характера нагрузки и от имеющихся ресурсов. - Оценить объем памяти, необходимой для кеширования (параметр CACHESIZE), можно с использованием команды htop. Если у вас на проекте memcache размером 1 GB и он очень быстро вытесняется, такое решение будет не эффективное.
Если у вас один сервер, настроить работу лучше через сокет:
- В файле /etc/sysconfig/memcached задать параметры:
- Перезапустить memcached командой:
CentOS 6:service memcached restart
CentOS 7:systemctl restart memcached.service
- После этого необходимо изменить настройки (добавить) в /bitrix/php_interface/dbconn.php:
На сокетеdefine("BX_CACHE_TYPE", "memcache"); define("BX_CACHE_SID", $_SERVER["DOCUMENT_ROOT"]."#01"); define("BX_MEMCACHE_HOST", "unix:///tmp/memcached.sock"); define("BX_MEMCACHE_PORT", "0");
Без сокетаdefine("BX_CACHE_TYPE", "memcache"); define("BX_CACHE_SID", $_SERVER["DOCUMENT_ROOT"]."#01"); define("BX_MEMCACHE_HOST", "127.0.0.1"); define("BX_MEMCACHE_PORT", "11211");
С сокетом и многосайтовостью битриксdefine("BX_CACHE_TYPE", "memcache"); define("BX_CACHE_SID", "#01"); define("BX_MEMCACHE_HOST", "unix:///tmp/memcached.sock"); define("BX_MEMCACHE_PORT", "0");
- Далее перезапустить memcached командой из пункта 2.
Выполняем команду htop => F3 (ищем memcache) и следим, как быстро вытесняет кэш и хватает ли нам выделенной памяти. Учитывая другие ресурсы, которые загружают память сервера.
- Убедиться, что 1С-Битрикс подключился к memcached можно на панели производительности http://вашсайт.ru/bitrix/admin/perfmon_panel.php
Такой способ хранения сэкономит большое количество памяти на диске, разумно будет использоваться файловое пространство, проект будет оптимизирован и корректно функционировать.
USER="bitrix" - пользователь, от которого будет запущен memcached; OPTIONS="-t 8 -s /tmp/memcached.sock" - количество потоков и путь к сокету.Должно получиться так (на сокете):
PORT="11211" USER="bitrix" MAXCONN="10240" CACHESIZE="8024" OPTIONS="-t 8 -s /tmp/memcached.sock"Если не используем подключение через сокет.
MAXCONN="10240" CACHESIZE="8024" OPTIONS="-t 8"
И в файле /bitrix/.settings_extra.php (если его нет, то создать):
На сокете
<?php return array( 'cache' => array( 'value' => array( 'type' => 'memcache', 'memcache' => array( 'host' => 'unix:///tmp/memcached.sock', 'port' => '0', ), 'sid' => $_SERVER["DOCUMENT_ROOT"]."#01" ), ), ); ?>Без сокета
<?php return array( 'cache' => array( 'value' => array( 'type' => 'memcache', 'memcache' => array( 'host' => '127.0.0.1', 'port' => '11211', ), 'sid' => $_SERVER["DOCUMENT_ROOT"]."#01" ), ), ); ?>С сокетом и многосайтовостью битрикс
<?php return array( 'cache' => array( 'value' => array( 'type' => 'memcache', 'memcache' => array( 'host' => 'unix:///tmp/memcached.sock', 'port' => '0', ), 'sid' => "#01" ), ), ); ?>
Примечание: Если используется многосайтовость, то в примере указывается статичный sid , без $_SERVER["DOCUMENT_ROOT"]. Иначе для двух сайтов кеш будет отличаться, так как папки сайтов разные.