Zend Opcache не кэширует все файлы (CentOS 6.7 + Nginx 1.8.1 + PHP 7 + Laravel 5.1)

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

Как указано в заголовке, мы развертываем это на сервере CentOS 6.7 с Nginx 1.8.1 и PHP 7 с PHP-FPM. Поскольку репозитории CentOS 6.7 не предлагают PHP 7, мы используем пакеты замены IUS.

Мы заметили, что одной из вещей, которая может вызывать низкую производительность, является тот факт, что Zend Opcache, несмотря на то, что он включен и работает (у нас хороший показатель совпадений), похоже, не кэширует все файлы в нашем проекте. Мы используем opcache-gui, чтобы помочь визуализировать содержимое кеша, и хотя многие файлы проекта присутствуют (включая файлы из сторонних библиотек), большинство из них отсутствует, включая наш основной контроллер и многие вспомогательные классы. На самом деле, когда мы отключаем Opcache, время отклика практически не меняется. Черный список opcache в настоящее время пуст, так что это не причина, по которой они не включены.

Мы попытались принудительно кэшировать отсутствующие файлы с помощью opcache_compile_file(), и хотя файлы компилируются и кэшируются, они никогда не получают совпадений.

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

Есть ли что-то еще, что мне не хватает? Любые другие критерии, на которые PHP будет опираться при принятии решения о том, что кэшировать, а что нет?

Любая помощь по этому вопросу будет оценена!


person santista    schedule 20.05.2016    source источник
comment
Еще одна вещь, которую я хотел бы упомянуть, я знаю, что существует ограничение на количество ускоренных файлов, которые может обрабатывать opcache, которое можно настроить в настройке файла opcache.ini opcache.max_accelerated_files. В настоящее время у нас установлено значение 8000, чего должно быть более чем достаточно, чтобы покрыть все наши файлы, однако только около 163 в конечном итоге кэшируются.   -  person santista    schedule 20.05.2016
comment
Потребление памяти также не является проблемой, так как мы выделили 128 МБ через opcache.memory_consumption, opcache-gui показывает, что используется только 23,1 МБ.   -  person santista    schedule 20.05.2016
comment
Любое решение для этого? У меня такая же проблема.   -  person anon    schedule 01.06.2016
comment
Из любопытства. Что произойдет, если вы установите opcache.validate_timestamps=0 ?   -  person Danila Vershinin    schedule 05.07.2016


Ответы (1)


Вы можете проверить значение opcache.max_file_size? Возможно, это ваша проблема, так как скомпилированные файлы больше исходного файла.

Можете ли вы протестировать файлы, которых нет в opcache-gui, с помощью http://php.net/opcache-is-script-cached?

Кроме того, в качестве теста, вы можете попробовать принудительно скомпилировать? Для этого используйте http://php.net/opcache-compile-file. Это просто посмотреть, есть ли true и может ли он его скомпилировать в первую очередь.

person Yvan    schedule 21.04.2017