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

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

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

Сначала я подумал, что проблема заключается в переменной 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 так, чтобы он просто очищался при заполнении используемой памяти?

2 ответа

Решение

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

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

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

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

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

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

Достигаете ли вы этого предела или нет, вы должны начать собирать эти данные.

Другие вопросы по тегам