Php
PHP OPcache 正在自動重置記憶體
我開始使用 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 的限制,應該提高它。
無論您是否達到該限制,您都應該開始收集這些數據。