О себе События Портфолио Статьи Гостевая Фотоальбом На злобу дня Ссылки Учеба Программы
Alex_K (г.Киров) - Алексей Кощеев
Хостинг и регистрация доменов в Кирове

На злобу дня

Опыт внедрения OPcache

Опыт внедрения OPcache

7 лет я использовал в качестве ускорителя PHP-кода расширение eAccelerator (ea).

Периодически я мониторил, что предлагают альтернативные проекты (APC, XCache), но оставался приверженцем ea.

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

С выходом новой версии 1С-Битрикс обнаружилась новая проблема. 1С-Битрикс стал довольно прожорлив до памяти и сайты стали не вписываться в предусмотренные тарифными планами значения memory_limit.

Но это это полбеды. В добавок оказалось, что PHP 5.3 и 5.4 иногда может делать Segmentation fault при достижении этого лимита (подтверждением этому багрепорты от пользователей PHP; к сожалению, разработчики PHP пока не решили эту проблему).

И это еще не все. Иногда при достижении memory_limit стали появляться "залипшие" коннекты к базе данных MySQL (они находились в состоянии "Sleep"). Анализируя лог убивания залипших коннектов, обнаружил запрос к одному сайту, который гарантированно вызывал залипание коннекта. После отключения ea залипания не происходили.

Это стало последним аргументом в пользу того, что пора попробовать альтернативный кешер.

OPcache отличается от других кешеров тем, что именно он стал частью PHP с версии 5.5 (разрабатываемая версия).

Для PHP 5.2, 5.3, 5.4 кешер подключается как PECL-расширение zendopcache.

Миграция на OPcache вызвала затруднение в части написания файла с исключениями opcache.blacklist_filename.

В ea можно указать:

eaccelerator.filter = "!*/bitrix/cache/* !*/bitrix/managed_cache/* !*/bitrix/stack_cache/* *.php"

Оказалось, что в OPcache * не подразумевает символ /, т.е. маска работала внутри одного каталога.

В процессе изучения исходного кода выяснилось, что авторы используют возможности расширения ereg PHP: при инициализации расширение компилирует паттерны регулярных выражений-исключений, а во время работы делается только выполнение регулярных выражений по каждому скрипту-кандидату на кеширование. Очень рационально с точки зрения быстродействия (в ea этот момент примитивнее). Выяснилось, что перед компиляцей патернов ** заменяются на .*, а это уже похоже на настоящие регулярные выражения.

В итоге аналогичные исключения в OPcache выглядят так:

/**/bitrix/cache/
/**/bitrix/managed_cache/
/**/bitrix/stack_cache/

Слэш в начале строк нужен, чтобы OPcache не "нормализовал" путь.

Разобравшись с этим нюансом, можно сделать следующие настройки в php.ini:

zend_extension=/usr/local/lib/php/20100525/opcache.so
opcache.memory_consumption=400
opcache.interned_strings_buffer=4
opcache.max_accelerated_files=10000
opcache.revalidate_freq=0
opcache.fast_shutdown=1
opcache.blacklist_filename=/usr/local/php5/opcache.bx.bl
opcache.force_restart_timeout=60
opcache.file_update_protection=10
opcache.restrict_api=/usr/local/www/domains/1/WWW/ea/

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

Для сред разработки в документации рекомендуется opcache.revalidate_freq сделать равным 0. Для 1С-Битрикс тоже нужен 0. Не используем "слепой" кеш, постоянно сверяем дату изменения файла.

Параметр opcache.force_restart_timeout нужен, чтобы кешер автоматически перезапустился в случае проблем (например, при работе с разделяемой памятью теоретически можно словить дедлок, в ea пришлось писать патч, а тут это есть из "коробки").

Параметр opcache.file_update_protection тоже пригодится, чтобы не кешировать файлы, которые изменились меньше 10 секунд назад.

OPcache не имеет встроенного менеджера кеша. Когда скрипт изменяется, его старая копия остается в памяти (wasted memory). Кеш очищается автоматически и полностью, если недостаточно доступной памяти для кеширования новых файлов и при этом количество "wasted memory" больше, чем opcache.max_wasted_percentage % от opcache.memory_consumption. По умолчанию opcache.max_wasted_percentage=5.

Описание параметров можно посмотреть на сайте php.net или на официальной странице на GitHub.

В итоге в "попугаях" монитора производительности 1С-Битрикс обнаружен прирост производительности примерно на 60% (с 64 до 103 баллов).

Интересно было также посмотреть на реальном проекте под хорошей нагрузкой. К счастью под рукой был такой (порядка 75 тысяч хитов к PHP в час). Рост производительности составил 20-30% по сравнению с той же конфигурацией с ea без какой-либо правки кода!

Опубликовано: 11 февраля 2014 года.

Комментарии посетителей сайта

Валя    15.08.2016 14:54
  Как вы решили проблему со значением cacheenginenone? У меня установлен Opcahe и Битркис при проверке указывает значение cacheenginenone. Что с этим делать и как решать проблему. Производительность из за этого значения упала до 16 попугаев, а было 38

Omario    23.06.2015 00:12
  Спасибо большое за ответ!
Т.е его достаточно установить на сервер, включить, а в битрикс settings ничего не писать, это дало Вам прирост в производительности?

Ответ: 23.06.2015 09:01
Да.

Omario    22.06.2015 14:19
  Добрый день!
Хорошая и полезная инструкция, я как раз перехожу на VPS и есть возможность протестировать Opcache, До этого стоял APC и в панели производительности, на вкладке "Битрикс оптимально" - Место хранения кеша определялся как APC (в .settings.php так же была внесена строка для этого акселлератора), НО проблема в том что opcache установлен на сервере все работает, а Битрикс в той же вкладке определяет вот так "cacheenginenone" - т.е никак не определяет! Вы же пишите что "ничего дополнительно в сеттингс не вносили". Обратился в ТП Битрикс - ответ был такой "стандартными средствами opcache не настроить, используйте другие акселлераторы apc, xcache и т.д".

Как у Вас получилось сделать так чтобы он заработал?

Я думаю этот ответ поможет не только мне одному, т.к информации про это нет нигде.

С уважением,

Ответ: 22.06.2015 16:06
OPcache кеширует только опкод, т.е. предназначен для исключения фазы повторной компиляции PHP-скриптов. В нем нет механизмов для кеширования пользовательских данных.

Виталий    24.02.2015 22:30
  Добрый вечер!
А что вы прописали в /bitrix/.settings.php в cache?

Ответ: 25.02.2015 00:32
специально ничего не прописывал в /bitrix/.settings.php.

Victor    17.04.2014 11:49
  Здравствуйте, Алексей.
Объясните, пожалуйста, в чем смысл исключения из opcache файлов кешей Битрикс? По сути, эти файлы - тот же php-код, что и остальные php-файлы. Если исключить для них кеширование байт-кода, то их прекомпиляция будет выполняться при каждом обращении к кешам, тем самым снижая производительность. И опыт показывает, что без исключения этих файлов, монитор производительности показывает большее значение.
В чем я неправ, Алексей?

Ответ: 17.04.2014 12:15
1. "код", который находится в файлах кеша битрикса, примитивен; нет смысла хранить его представление в оперативной памяти.
2. устаревание кеша влияет на размер wasted memory, в итоге рестарт opcache будет проиcходить чаще.
3. при неправильной настройке кеш битрикса начинает разрастаться до неприличных размеров.

в масштабах виртуального хостинга кеширование кеша битрикса неоправдано "дорого".

darkleech    15.03.2014 11:38
  Сууупер!! Спасибо Вам огромное!!))
Сейчас тогда на Малом Бизнесе замерю, что он там шепнет мне)

darkleech    15.03.2014 09:50
  Алексей, добрый день. Вы не могли бы поделиться на каком сервере вы добились производительности 103?
И на какой редакции Битрикс?
У меня на SSD не получается на редакции Бизнес больше 70 получить, к сожалению.

Заранее благодарю за все, даже если не поделитесь!)))

Ответ: 15.03.2014 11:09
Сервер из этой линейки http://www.depo.ru/config_depo_c1973_i142630_m2.aspx
Редакция "Малый Бизнес", она является эталонной для рейтинга http://www.1c-bitrix.ru/partners/hosting.php
Диски SATA 7200 Raid edition.

+у нас собственная сборка PHP, которая в некоторых местах дает хороший прирост и улучшает стабильность.

Далее: REG.RU покрывает спамеров?
Предыдущая заметка: Конвертируем PDF в TIF
Перейти к списку заметок
Fanshop.ru

Рейтинг@Mail.ru

Rambler's Top100

© Алексей Кощеев, г.Киров, 2001-2024 хостинг предоставлен компанией Айхэд