5 votes

PHP OPcache réinitialise automatiquement le cache

J'ai commencé à utiliser le OPcache intégré à PHP 5.6 et je rencontre un problème maintenant. Je l'ai configuré pour utiliser jusqu'à 1 Go de RAM, ce qui est largement suffisant pour mes sites web, mais il n'atteint jamais cette limite. Le cache est effacé de nombreuses fois avant d'atteindre cette limite comme vous pouvez le voir sur ce graphique munin :

entrez la description de l'image ici entrez la description de l'image ici

Ainsi, tous les quelques jours, il supprime tous les fichiers du cache et recommence à les mettre en cache.

Au début, j'ai pensé que le problème était lié à la variable opcache.max_wasted_percentage mais peu importe la valeur que je lui donne, cela ne change rien. Ma configuration est la suivante :

; configuration pour le module php ZendOpcache
; priorité=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

Je l'utilise dans un environnement basé sur Debian Jessie avec nginx et FastCGI.

Je souhaite que le cache ne soit effacé que lorsque la consommation de mémoire a atteint 1 Go. J'ai déjà essayé une configuration très minimale ressemblant à ceci :

; configuration pour le module php ZendOpcache
; priorité=05
zend_extension=opcache.so
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 1024

Même dans ce cas, le problème persiste.

Si la configuration FPM est nécessaire :

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

J'espère trouver ici quelqu'un qui a déjà rencontré ce problème et qui a pu le résoudre. Ma question finale est la suivante : Comment configurer l'OpCache pour qu'il ne soit effacé que lorsque la mémoire utilisable est pleine ?

1voto

Michael Hampton Points 232226

OPcache vide entièrement le cache et recommence à zéro chaque fois qu'il atteint l'une de ses limites configurées. Ce comportement est un peu ennuyeux, mais c'est ce avec quoi nous sommes coincés pour l'instant.

Comme vous ne dépassez pas la limite de mémoire, je suppose que vous atteignez une limite sur laquelle vous ne collectez pas de métriques.

En particulier, vous ne collectez pas de métriques sur le nombre de clés de cache (fichiers) utilisées. Je soupçonne que vous atteignez la limite de 65407 que vous avez configurée, et vous devriez la relever.

Que vous atteigniez cette limite ou non, vous devriez commencer à recueillir ces données.

0voto

KittMedia Points 228

Je pourrais maintenant vérifier quelle était le problème dans mon cas :

J'utilise un logiciel, capable de supprimer ses propres caches et qui utilise un système de packages, où vous pouvez installer de nouveaux packages.

Chaque fois que j'installe un nouveau package ou que je vide le cache, le logiciel exécute un opcache_reset() au lieu d'utiliser simplement opcache_invalidate() car il sait quels fichiers vont être modifiés...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X