XCache — кэширование байткода. XCache установка, xCache настройка, нюансы Просмотр статистики Xcache

  • Дата: 18.08.2021

Как известно, PHP - интерпретируемый язык, т.е. каждый раз при обращении к скрипту, этот скрипт компилируется. Если у вас 1 скрипт, то ничего страшного нет, так как время компиляции не большое. Но в современных CMS и фрэймворках при отображении страницы используется 10-300 отдельных php-файлов (проще говоря, инклуды). Чем больше инклудов и чем они тяжелее, тем дольше выполняется процесс компиляции.

Для решения этой проблемы придумали хранить компилированный вид скрипта в памяти. Существуют специальные модули для хранения откомпиленного кода в памяти. Называются они акселераторы.

Самые известные: eAccelerator, APC, XCache. У каждого есть свои плюсы и минусы. Я использую XCache как наиболее быстрый и надежный. Хотя у каждого есть свое мнение по поводу надежности.

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

Админка XCache

У XCache есть небольшая админка для вывода статистики и сброса кэша. Лежит она обычно здесь /usr/local/share/examples/xcache/admin/. Поэтому нужно вынести эту папку куда-нибудь в корень сайта или в свою админку, чтобы можно было смотреть из браузера. Можете скачать админку .

Вот так это выглядит у меня

Первая таблица показывает общую статистику. В ней 2 строчки, так как процессор у меня 2-х ядерный и XCache распределяет кэш по обоим ядрам. Всего у меня выделено 512M.

Админка может выдавать ошибку Fatal error: xcache_count(): xcache.admin.user and xcache.admin.pass
Значит у вас включена авторизация в конфиге xCache.
Проще всего ее вырубить. Я на своем сервере один и ставить пароли внутри сервера мне не нужно.
Авторизация выключаетя в конфиге xcache.admin.enable_auth = Off

Конфиг xCache лежит обычно по адресу /etc/php5/conf.d/xcache.ini
После редактирования конфига необходимо перезагрузить Апач.

Статистика xCache

вернемся к админке (см. картинку выше).

Slots - кол-во слотов под кэш. Это я так понимаю на сколько частей бьется выделяемая память. В моем случае это 8000. Чем больше это значение, тем быстрее идет поиск, но требуется больше памяти.

Size - размер памяти под XCache

Avail - сколько памяти осталось. Как видно у меня ее не осталось. Забиты все 512 Mb

Clear - кнопка сброса кэша

Hits - сколько обращений к файлам было сделано

Misses - сколько обращений к файлам было сделано, но этих файлов в памяти не оказалось. Это нормальный процесс. Файлы меняются - из кэша они вылетают. Но в моем случае все файлы просто не влезают в память, поэтому их там нет, и соответственно идут промахи.

Clogs - это я так понимаю сколько раз мы обратились за какими-то файлами в кэш, но в это время эти файлы еще компилировались, т.е. была блокировка.

OOMs - сколько раз файлы не попали в кэш из-за нехватки памяти.

Cached - кол-во файлов в кэше. Всего у меня 6400 файлов.

Настройки xCache

Пара слов о том, сколько памяти следует выделять. Изначально я выделил 128 Mb, но эта память забилась за 10 минут. Поэтому я выделил 512 Mb и этот объем уже забился за 1 час. Казалось бы, можно выделить 1 Gb и тогда бы точно всё влезло. Но памяти всего 4Гб и лучше выделить ее под MySQL (об этом ). Тем более, файлы которые не попали в кэш в течение часа - это редко используемые скрипты. Просто есть сайты, на которые заходят 10-100 человек в день и без кэширования там можно обойтись. Это так называемый «длинный хвост», который редко используется, но места занимает много. В моем случае это 3% (Misses/Hits).

Что еще не нужно забывать. Допустим, вы поменяли какой-то код на крупной проекте. Место в памяти освободилось и на это пустое место могут быть записаны файлы низкопосещаемых проектов. Соответственно файлы крупного проекта не попадут в кэш. Проще говоря, XCache НЕ умеет отслеживать какие файлы можно выкинуть из кэша и поместить на их место более часто запрашиваемые файлы (это так называемый «горячий» кэш). Поэтому нужно сбрасывать кэш вручную через админку.

Нижняя таблица показывает какие файлы кэшируются и насколько эффективно.

Hits - кол-во обращений к этому скрипту в памяти. Чем больше - тем лучше. Если для некоторых файлов долгое время это значение меньше 10, то значит этот файл редко используется, и лишь занимает место в памяти.

Size - размер этого файла в памяти. Вот тут самое интересное. Получается, что откомпилированный файл занимает в памяти в 10 раз больше места, чем на диске. OMG!

SrcSize - размер файла на диске

Access - как давно обращались к этому файлу

Create - сколько времени этот файл лежит в кэше

Мой конфиг
xcache.size = 512M
xcache.count = 2
xcache.slots = 8K
xcache.ttl = 0
xcache.gc_interval = 0
xcache.var_size = 0M
xcache.var_count = 2
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.test = Off
xcache.cacher = On
xcache.stat = On

Как видно, я отключил использование XCache в качестве кэширования результатов вычислений (xcache.var_size = 0M). Для этого у меня есть Memcache.

Ну и собственно результаты: ускорение в 2-3 раза. Если раньше страница генерировалась за 0.3 секунды (с учетом Memcache), то теперь 0.1 секунды. Это пример из одного проекта на CMS LiveStreet.

xCache - это программа из серии тех, что кешируют байт-код php для оптимизации и ускорения выполнения скриптов. Как, например, eAccelerator или PHP-APC.

В статье будет рассматриваться базовая настройка. А дальше можно подкручивать параметры в соответствии с собственными пожеланиями.

Нет смысла долго задерживаться на установке: всё делается стандартно.

Aptitude install php5-xcache

Основные настройки кэша

Первоочередной задачей будет указание основных настроек для работы. Откройте в вашем любимом редакторе файл . Все параметры собраны по группам. В данный момент нам нужна группа

xcache.size = 32M

Данная директива указывает общий объём памяти для кэша. По-умолчанию 16 мегабайт.

xcache.count = 1

Указывается по количеству процессоров (ядер). Два ядра - ставим 2. И так далее. Или два одноядерных процессора.

xcache.ttl = 0

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

Рассмотрим параметры, необходимые для кэширования переменных. В определённых условиях, это тоже может пригодится.

xcache.var_size = 8M

Общий объём памяти, выделяемой для кэша переменных. По-умолчанию 0 - отключено.

xcache.var_count = 1

Эта переменная аналогична xcache.count.

xcache.var_ttl = 0

Тут тоже можно привести аналогию с переменной xcache.ttl: задаёт время жизни кэша переменных.

xcache.var_maxttl = 0

Эта переменная указывает максимальное время жизни кэша.

XCache Optimizer

Иногда может потребоваться включить встроенный в xCache оптимизатор. Для этого следующую директиву нужно перевести из состояния off в состояние on .

Xcache.optimizer = on

Админ-панель для xCache

xCache поставляется вместе с панелью управления, позволяющей просматривать статистику. У меня связка nginx+php-fpm, пример будет написан с учётом этого.

Прежде всего настраиваем nginx. Здесь потребуется использование alias для location.

Location /x/ { alias /usr/share/xcache/admin/; location ~ .php$ { fastcgi_index index.php; fastcgi_pass unix:/run/php-fpm.sock; include fastcgi_params; fastcgi_param PHP_ADMIN_VALUE "open_basedir=/usr/share/xcache/admin/:/var/php-temp-dir/"; fastcgi_param SCRIPT_FILENAME $request_filename; } }

Прописываем конфигурацию для любого виртуального хоста, перезапускаем nginx: service nginx reload . Далее в браузере открываем страницу http://example.com /x/mkpassword.php . Example.com замените на адрес вашего сайта, для которого вы создали алиас.

При помощи данного скрипта нужно создать md5-хеш пароля, который будет использоваться при аутентификации в админ-панели xCache. Достаточно указать пароль, нажать кнопку «Отправить запрос» и полученный результат скопировать.

После всех этих действий открываем файл /etc/php5/mods-available/xcache.ini , в группе редактируем необходимые параметры.

xcache.admin.user = «username»

Указываем имя пользователя, у которого будет доступ к админке.

xcache.admin.pass = «…»

Здесь в кавычках нужно указать md5-хеш пароля пользователя.

Сохраняем отредактированный файл и перезапускаем apache, php-cgi или php-fpm.

Теперь админка xcache должна быть доступна по адресу http://example.com/x/. Попробуйте авторизоваться и просмотреть статистику.

Использование акселератора в несколько раз уменьшает время генерации страницы, а так же уменьшает нагрузку на процессор сервера. Так у меня после настройки Xcache на сервере количество используемого процессорного времени уменьшилось практически в двое. А так как я использую для размещения своих сайтов виртуальный сервер, где плачу только за использование ресурсов, использование php-акселератора уменьшает итоговою стоимость аренды сервера.

Итак приступим к установке на сервер акселератор php кода - Xcache .

Я использую на сервере операционную систему Ubuntu 10.04 , но и на более новых, например недавно вышедшей Ubuntu LTS 12.04 14.04 с долговременной поддержкой, все будет выглядеть так же. Так же все работает на Debian 7.

Устанавливаем:

Sudo apt-get install php5-xcache

Установится последняя стабильная версия, по этому ничего компилировать не нужно.

После установки открываем файл конфигурации в /etc/php5/conf.d/xcache.ini

У меня он выглядит так:

xcache.size = 128M

xcache.count = 14

xcache.slots = 8K

xcache.ttl = 36000

xcache.gc_interval = 36000

xcache.var_size = 8M

xcache.var_count = 14

xcache.var_slots = 8K

xcache.var_ttl = 36000

xcache.var_maxttl = 604800

xcache.cacher = On

xcache.stat = On

Основные параметры:

xcache.size - отвечает за количество памяти для хранения кеша. Если значение будет слишком маленьким, то эффекта от кеширования толком не будет.

xcache.count - количество блоков, на которые будет делиться кеш. Рекомендуется выставлять по количеству ядер процессора.

xcache.slots - Количество слотов под кеш, чем больше слотов, тем больше скорость поиска в кеше. Но и увеличивается потребление памяти. Рекомендуется оставлять значение по умолчанию: 8K

xcache.ttl -Время жизни кешированного объекта в секундах. Если к объекту никто не обращался в течении указанного времени, объкт помечается как не используемый, и в последующем удаляется из кеша сборщиком мусора.

xcache.gc_interval - интервал запуска сборщика мусора в секундах. Определяет промежуток времени, через который будет запускться сборщик мусора. Запустившись, он ищет записи с истекшим временем жизни(xcache.ttl) и удаляет их из кеша.

Два последних параметра(xcache.ttl и xcache.gc_interval) очень важны в настройке Xcache, но на многих сайтах значения данных параметров выставлены в 0, соответственно из кеша ничего не удаляется, и при полном заполнении новые скрипты уже в него не попадают. То есть, если вы разместите на сервере новый сайт, то его скрипты уже не попадут в кеш, так как он полностью заполнен скриптами предыдущего сайта.

Параметры начинающиеся с xcache.var_ отвечают за кэширования результатов вычислений. И их параметры аналогичны.

После сохранения настроек следует перезапустить вебсервер.

Sudo /etc/init.d/apache2 restart

Просмотр статистики Xcache

У Xcache есть своя админка, которая позволяет просматривать текущее состояние и очищать кеш.

Что бы она заработала, нужно скопировать папку admin из /usr/local/share/examples/xcache/admin/ в каталог вашего сайта.(Ubuntu)

В Debian 7 данный каталог лежит по пути /usr/share/xcache

Но перед этим следует установить пароль в файле конфигурации. За это отвечают параметры

xcache.admin.enable_auth

xcache.admin.user= «user»

xcache.admin.pass= «password»

пароль нужно указывать как md5хеш для большей надежности.

Получить md5хеш можно выполнив

Php echo md5("password"); ?>

или можно получить хеш например на сайте

Slots - Количество слотов под кеш, чем больше слотов, тем больше скорость поиска в кеше. Но и увеличивается потребление памяти. Рекомендуется оставлять значение по умолчанию: 8K

Size - размер памяти под Xcache.

Avail - сколько памяти осталось.

Clear - сбросить кеш.

Hits - сколько обращений к файлам было сделано

Misses - сколько обращений к файлам было сделано, но этих файлов в памяти не оказалось.

Clogs - временно заблокированных файлов в кеше.

OOMs - Количество файлов которые не смогли попасть в кеш изза нехватки памяти.

Cached - Общее количество файлов в кеше.

Нижняя таблица показывает какие файлы кэшируются и насколько эффективно.

Hits - кол-во обращений к этому скрипту в памяти. Чем больше - тем лучше. Если для некоторых файлов долгое время это значение меньше 10, то значит этот файл редко используется, и лишь занимает место в памяти.

Size - размер этого файла в памяти. Вот тут самое интересное. Получается, что откомпилированный файл занимает в памяти в 10 раз больше места, чем на диске. OMG!

SrcSize - размер файла на диске

Access - как давно обращались к этому файлу

Create - сколько времени этот файл лежит в кэше

Виртуальный сервер арендую у

X Cache является свободным и открытым исходным кодом PHP. С использованием XCache у вас будет более высокая производительность вашего выполнения PHP сценария на Линукс VPS . Он может достичь этого, исключая время компиляции PHP кода, кэширует скомпилированную версию PHP кода в память, а затем использует скомпилированную версию кода. Это может значительно ускорить время генерации страницы вплоть до в 5 раз быстрее, а также оптимизирует и повышает многие другие аспекты PHP скриптов и снижает нагрузку на сервер.

В этом уроке мы покажем вам, как установить XCache на CentOS 7 VPS.

Прежде всего, войдите на свой сервер CentOS 7 VPS и убедитесь, что все пакеты на вашем сервере в актуальном состоянии

Yum -y update

Затем, установите следующие пакеты

Yum install -y php-devel gcc make

После того, как будут установлены необходимые пакеты, приступите к скачиванию XCache. Перейти на их официальный сайт и выберете последнюю стабильную версию XCache. На момент написания этой статьи это версия 3.2.0

Cd /opt wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz

Распакуйте загруженный архив.tar

Tar -zxvf xcache-3.2.0.tar.gz

Это создаст новый каталог ‘XCache-3.2.0’. Перейдите в этот каталог

Cd xcache-3.2.0

Выполните команду phpize, чтобы подготовить XCache как расширение PHP

Phpize Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525

./configure --enable-xcache make make install

Расположение xcache.so показано на последнем шаге

Installing shared extensions: /usr/lib64/php/modules/

Таким образом, расположение расширения XCache является путь:

/usr/lib64/php/modules/

Теперь нам необходимо отредактировать конфигурационный файл PHP. Для того, чтобы найти его, необходимо. чтобы вы выполнили

Php -i |grep php.ini Configuration File (php.ini) Path => /etc Loaded Configuration File => /etc/php.ini

Создайте файл конфигурации для XCache, и добавьте следующие строки

Nano /etc/php.d/xcache.ini extension = /usr/lib64/php/modules/xcache.so xcache.shm_scheme = "mmap" xcache.size = 32M xcache.count = 1 xcache.slots = 8K xcache.ttl = 3600 xcache.gc_interval = 300 ; Same as aboves but for variable cache ; If you don"t know for sure that you need this, you probably don"t xcache.var_size = 0M xcache.var_count = 1 xcache.var_slots = 8K xcache.var_ttl = 0 xcache.var_maxttl = 0 xcache.var_gc_interval = 300 ; N/A for /dev/zero xcache.readonly_protection = Off xcache.mmap_path = "/dev/zero" xcache.cacher = On xcache.stat = On

Вы можете изменить параметры в файле xcache.ini в соответствии с вашими потребностями.

Перезагрузите веб-сервер Apache для того, чтобы изменения вступили в силу

Systemctl restart httpd.service

На этом этапе XCache должен быть успешно установлен на вашем сервере. Вы можете проверить это, выполнив следующую команду

# php -v PHP 5.4.16 (cli) (built: Jun 23 2015 21:17:27) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies with XCache v3.2.0, Copyright (c) 2005-2014, by mOo with XCache Optimizer v3.2.0, Copyright (c) 2005-2014, by mOo with XCache Cacher v3.2.0, Copyright (c) 2005-2014, by mOo with XCache Coverager v3.2.0, Copyright (c) 2005-2014, by mOo

PS . Если вам понравился этот пост, пожалуйста, поделитесь им с друзьями в социальных сетях с помощью кнопок на левой части поста или просто оставьте комментарий ниже. Заранее благодарю.

.
Процесс установки очень прост:

# wget http://xcache.lighttpd.net/pub/Releases/1.3.1/xcache-1.3.1.tar.gz
# tar zxf xcache-1.2.2.tar.gz
# cd xcache-1.2.2
# phpize
# ./configure --enable-xcache
# make && make install

Но не обошлось без непредвиденных трудностей. Во-первых, сначала не нашлось phpize . Как выяснилось, надо было поставить пакет php-devel ( #yum install php-devel ). Во-вторых, возникла ошибка на этапе сборки — компилятор ругался на отсутствующий файл заголовка timelib_config.h . После недолгого поиска в Google решение нашлось: в файле /usr/include/php/ext/date/lib/timelib_structs.h нужно было заменить

#include

#include "timelib_config.h"

Дальше сборка и установка прошла без проблем. Оставалось только добавить в /etc/php.ini настройки для XCache (особо не задумываясь, я взял их из статьи, на которую привел ссылку выше, только в строке zend_extension заменил путь на свой: /usr/lib/php/modules/xcache.so ).

После этого проверил работоспособность PHP командой php -m и все заработало!

Дальше оставалось только перезапустить Apache и наслаждаться эффектом. Усилия того стоили: сайты и работать стали быстрее (правда, могу оценить это только субъективно, точных измерений не проводил) и памяти потреблять меньше. В частности, моя TextCMS вместо 320 Kb на страницу стала потреблять всего 120!

Пример настройки параметров:

;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20060613/xcache.so


xcache.admin.enable_auth = On
xcache.admin.user = "mOo"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = ""


; ini only settings, all the values here is default unless explained
; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
; to disable: xcache.size=0
; to enable: xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size = 32M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count = 1
; just a hash hints, you can always store count(items) > slots
xcache.slots = 8K
; ttl of the cache item, 0=forever
xcache.ttl = 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval = 0
; same as aboves but for variable cache
xcache.var_size = 0M
xcache.var_count = 1
xcache.var_slots = 8K
; default ttl
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
xcache.test = Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won"t share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
xcache.mmap_path = "/dev/zero"
; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it"s writable by php (without checking open_basedir)
xcache.coredump_directory = ""
; per request settings
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off


; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
xcache.coverager = Off
; ini only settings
; make sure it"s readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
xcache.coveragedump_directory = ""