Назад | Перейти на главную страницу

PHP OPcache автоматически сбрасывает кеш

Я начал использовать встроенный PHP OPcache PHP 5.6 и сейчас столкнулся с проблемой. Я настроил его на использование до 1 ГБ ОЗУ, что достаточно для моих веб-сайтов, но он никогда не может использовать полный 1 ГБ ОЗУ. Кеш очищается много раз, прежде чем будет выделен этот лимит, как вы можете видеть на этом графике мунинов:

Таким образом, каждые несколько дней он удаляет все файлы из кеша и снова начинает их кешировать.

Сначала я подумал, что проблема в переменной opcache.max_wasted_percentage но его не волнует, какое значение я его установил. Моя конфигурация следующая:

; configuration for php ZendOpcache module
; priority=05
zend_extension=opcache.so
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 1024
opcache.interned_strings_buffer = 128
opcache.blacklist_filename = /etc/php5/opcache_blacklist.txt
opcache.max_accelerated_files = 65407
opcache.revalidate_freq = 5
opcache.fast_shutdown = 1
opcache.max_wasted_percentage = 50
opcache.enable_file_override = 1

Я использую его в среде последней версии Debian Jessie с nginx и FastCGI.

Я хочу добиться, чтобы кеш очищался только тогда, когда потребление памяти достигло 1 ГБ. Я уже пробовал очень минимальную конфигурацию, которая выглядит так:

; configuration for php ZendOpcache module
; priority=05
zend_extension=opcache.so
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 1024

Даже в этом случае проблема не устранена.

Если нужна конфигурация FPM:

user = www
group = www
listen = 127.0.0.1:9002
listen.owner = www
listen.group = www

listen.allowed_clients = 127.0.0.1
pm = ondemand
pm.max_children = 100
pm.process_idle_timeout = 5s;

php.ini:

[PHP]
engine = On
short_open_tag = Off
asp_tags = Off
precision = 14
y2k_compliance = On
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 17
allow_call_time_pass_reference = Off
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions = escapeshellcmd, exec, ini_restore, passthru, popen, proc_nice, proc_open, shell_exec, show_source, system
disable_classes =
zend.enable_gc = On
expose_php = Off
max_execution_time = 120
max_input_time = 300
memory_limit = 512M
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = Off
error_log = /var/log/nginx/php_error.log
variables_order = "GPCS"
request_order = "GP"
register_globals = Off
register_long_arrays = Off
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 2000M
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
enable_dl = Off
cgi.fix_pathinfo = 0
file_uploads = On
upload_max_filesize = 200M
max_file_uploads = 200
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

Надеюсь, я смогу найти здесь любого, кто уже сталкивался с этой проблемой и мог ее решить. Итак, мой последний вопрос: как я могу настроить OpCache, чтобы он просто очищался, когда полезная память заполнена?

Теперь я мог проверить, в чем проблема в моем случае:

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

Каждый раз, когда я устанавливаю новый пакет или очищаю кеш, программа запускает opcache_reset() вместо того, чтобы просто использовать opcache_invalidate() потому что он знает, какие файлы будут изменены…

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

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

В частности, вы не собираете показатели количества используемых ключей (файлов) кеша. Я подозреваю, что вы достигли установленного вами лимита в 65407, и вам следует его повысить.

Независимо от того, достигаете ли вы этого предела или нет, вам следует начать сбор этих данных.