В прошлой статье я рассказывал как можно увеличить производительность сайта на wodpress за счет тюнинга nginx + php-fpm.
Сегодня будем увеличивать производительность за счет плагина W3 Total Cache. Сам по себе он уже дает ощутимый прирост по производительности в базовой настройке. Мы же протестируем его использования совместно с redis и memcached.
Делаем замеры производительности перед использованием плагина:
Получаем всего 14 РПС.
Устанавливаем плагин W3 Total Cache. В боковом меню должна появится вкладка «Performance».
Идем в «Настройки» — «Основные настройки». Нам нужно включить следующее:
- Кеш страницы. Ставим то, что доступно, скорее всего это будет Disk.
- Кэш OpCode — так как у меняя уже включен opcache, плагин это увидел и проставил автоматически.
- Кэш базы данных — также Disk.
- Кэш объекта — Disk.
- Кэш браузера — просто включаем.
Настроек гораздо больше, но мы сегодня касаемся только кеша.
Итак, делаем сохраняем и делаем замеры после включения плагина.
Результаты уже поражают. Latency и РПС выросли почти в 15 раз.
В целом можно было бы оставить и так, но мы хотим еще больше скорости.
Тестируем с memcached:
Устанавливаем memcached. У меня старенький centos 7, но принцип в целом один и тот же, на любом дистрибутиве.
yum install memcached
yum install libmemcached
# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="1024"
OPTIONS="-t 8 -l 127.0.0.1 -U 0"
Из важного тут:
CACHESIZE — размер кеша в МБ. У меня на сервере в среднем доступно 2ГБ, следовательно 1ГБ под кеш можно легко выделить.
OPTIONS — запускаем на localhost. Устанавливаем 8 поток (по умолчанию 4) и отключаем использование UDP.
Запускаем и проверяем работу:
systemctl start memcached
memcached-tool 127.0.0.1 stats
В ответ мы увидим нечто вроде:
Устанавливаем расширения для php:
yum install php82-php-memcached
yum install php82-php-memcache
memcache без «d» на конце, по сути тоже самое, только более старое расширение. Его установка опциональна.
Лично у меня все установленные модули складируются в отдельную директорию, следовательно нужно ее прописать в php.ini:
extension_dir = "/opt/remi/php82/root/usr/lib64/php/modules/"
Далее включаем расширение. В centos 7 нет phpenmod утилиты, включить можно через добавление соответствующего файла в /etc/php.d/
###10-memcache.ini
; Enable memcache extension module
extension=memcache
###20-memcached.ini
; Enable memcached extension module
extension=memcached
Все файлы начинаются с чисел, это для нумерации, того как они будут загружены в php. Это имеет значение, так как если последовательность будет неправильной, вы будете получать ошибки вида:
Чтобы их избежать установить msgpack и igbanary расширение.
Первыми должны быть загружены: memcache, msgpack, opcache, igbinary.
У меня это просто правильное наименование файлов .ini. В ubuntu например это правильный порядок перечисления расширений для команды phpenmod.
Проверить загруженные модули можно так:
php -m |grep memcache
Перезагружаем php-fpm и в настройках плагина меняем Disk на memcached. Теперь он должен быть доступен.
Делаем контрольные замеры:
Да, по сравнению с первоначальным скачком, мы не сильно улучшили производительность, дело в том, что плагин «из коробки» неплохо настроен и дает очень хорошие показатели. Даже не смотря на это, мы выиграли 3 РПС и смогли снизить latency.
Тестируем с redis:
Устанавливаем redis и его расширение для php. Для centos 7 это выглядит так:
yum install rh-redis6-redis
systemctl start rh-redis6-redis.service
ln -s /opt/rh/rh-redis6/root/usr/bin/redis-cli /bin/redis-cli
yum install php82-php-redis
Включаем модуль для php, заходим в redis и смотрим наличие ключей:
redis-cli
keys *
Ключей на данный момент нет, так и должно быть.
Далее в настройках плагина меняем все на redis.
Сохраняем и запускаем тест wrk:
Результат примерно такой же, но с memcached latency все же был лучше.
Вот таким образом имея достаточно «базовые» настройки плагина и приложения для кеширования мы увеличили производительность примерно в 15 раз.