Php

PHP OPcache 正在自動重置記憶體

  • June 8, 2016

我開始使用 PHP 5.6 的內置 PHP OPcache,現在遇到了問題。我將它設置為最多使用 1 GB 的 RAM,這對於我的網站來說已經足夠了,但它永遠無法使用完整的 1 GB 的 RAM。記憶體在分配此限制之前已被清除多次,如您在此 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

我在帶有 nginx 和 FastCGI 的最新 Debian Jessie 環境中使用它。

我想實現只有在記憶體消耗達到 1 GB 時才會清除記憶體。我已經嘗試了一個非常小的配置,如下所示:

; 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 的限制,應該提高它。

無論您是否達到該限制,您都應該開始收集這些數據。

引用自:https://serverfault.com/questions/730953