php-fpm模式下opcache的php fpm 内存占用过高是共享全部吗

使用 Zend Opcache 加速 PHP | 水景一页
Haoxian Zeng's personal website.
您在这里:
使用 Zend Opcache 加速 PHP
Optimizer+ 是 Zend 开发的闭源但可以免费使用的 PHP 优化加速组件,是第一个也是最快的 opcode 缓存工具。现在,Zend 科技公司将 Optimizer+ 在 PHP License 下开源成为 Zend Opcache。
Zend OPcache 通过 opcode 缓存和优化提供更快的 PHP 执行过程。它将预编译的脚本文件存储在共享内存中供以后使用,从而避免了从磁盘读取代码并进行编译的时间消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。
目录 Contents
1. 什么是 opcode 缓存?
当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销。如果动态内容的性能瓶颈不在于 CPU 和内存,而在于 I/O 操作,比如数据库查询带来的磁盘 I/O 开销,那么 opcode cache 的性能提升是非常有限的。但是既然 opcode cache 能带来 CPU 和内存开销的降低,这总归是好事 —— 本着环保的态度,也应该尽量减少消耗不是? :D
现代操作码缓存器(Optimizer+,APC2.0+,其他)使用共享内存进行存储,并且可以直接从中执行文件,而不用在执行前“反序列化”代码。这将带来显着的性能加速,通常降低了整体服务器的内存消耗,而且很少有缺点。
2. Optimizer+ 与 APC 的优缺点对比
Optimizer+ 于 2013年3月中旬为 Opcache。
根据 PHP wiki 上的,Zend Opcache 即将整合到 php 5.5 中。作为
的竞争对手,新生的 Zend Opcache 很有可能取代 APC 的位置,虽然 OptimizerPlus 没有象 APC 那样的 user cache 功能。
性能。根据测试,Zend Optimizer+ 始终优于 APC。随代码差异,每秒钟处理的请求数高 5~20%。Google doc 上记录的中,WordPress 2.1.1(不知道为什么不用个新版本的 WP 来测试),性能提高约 8%。理论上来说,对于 WP 3.5.1,性能应该也能得到大约 5~10% 的提升吧。对于运行 WordPress 的服务器而言,使用 Optimizer+ 可以显著降低 CPU 使用率和提高页面加载速度()。
支持新的 PHP 版本。Zend 和 PHP 社区都会帮助 Optimizer+ 能够支持最新版本的 PHP。
可靠性。Optimizer+ 拥有可选的损坏检测能力,可以防止因数据损坏而导致的服务器崩溃。
更好的兼容性。PHP 社区打算让 Optimizer+ 与社区支持的所有 PHP 版本相兼容。
APC 有数据缓存 API,而 Optimizer+ 没有。
APC 能够回收旧的无效的脚本占用的内存。APC 有内存管理器,可以将那些不再使用的脚本关联的内存进行回收。而 Optimizer+ 不同,它将这样的内存标记为“脏的”,但并不会回收它们。一旦“脏的”内存占用配置阈值的百分比达到一定值,Optimizer+ 就将自己重新启动。这种行为在稳定性上既有优势也有劣势。
3. 使用 Zend Opcode
现在已经可以使用 Zend Opcache 替代 APC 作为 PHP 优化加速工具了。目前的 Zend Opcode 兼容 PHP 5.2.*、5.3.*、5.4.* 和 PHP-5.5 开发版。不过,将来会取消对 PHP 5.2 的支持。
注意:Zend Opcache 与
相冲突。要安装 Zend Opcache,可能需要先卸载 eaccelerator —— 如果你用了这个加速模块的话。
从源码安装并配置
Zend Opcache 的源代码托管在 github 上,目前还是叫做 。
安装步骤详见其 README 文件。
最好在本地虚拟机里测试之后再部署到自己的服务器上;
安装前最好先删除 eacceleratro、xcache 或 apc 等组件。
顺便说一句,从源码编译安装时需要用到 php-devel。README 中快速安装一节的开头就用到,
$PHP_DIR/bin/phpize
如果不清楚 phpize 的路径,可以,
whereis phpize
README 文件中也有相应的推荐优化设置。
从 EPEL 源安装并配置
我不喜欢从源码编译安装程序,一个是水平有限,一个就是怕麻烦。下面介绍从 EPEL 安装源安装 Zend Opcache,以 CentOS 上的操作为例,基于。
EPEL 社区已经提供了 Zend Opcache 的安装包,可以直接 yum 安装。当然,前提是已经配置使用了 EPEL 的安装源。如果没有,可以参考。
提醒一下,上的 PHP 已经是 5.4 版本了。鉴于有人测试说 WordPress 在 PHP 5.4 上的性能要优于在 PHP 5.3 上的性能( and ),顺便升级一下 PHP 也不是什么坏事。
操作步骤:
。已有则跳过。
删除 eaccelerator、xcache、apc:
yum remove php-eaccelerator php-xcache php-apcu
没有使用则跳过。
对系统执行升级:
yum update
目的是根据 remi 安装源的状态升级当前的 php 等软件到 remi 支持的最新版本。此时,可以看到系统有类似下面的输出:
: php-common-5.4.14-1.el6.remi.i686
WARNING : These php-* RPM are not official Fedora / Red Hat build and
overrides the official ones. Don't file bugs on Fedora Project nor Red Hat.
Use dedicated forums /
warning: /etc/php.ini created as /etc/php.ini.rpmnew
: mysql-libs-5.5.31-1.el6.remi.i686
WARNING : This MySQL RPM is not an official Fedora / Red Hat build and it
overrides the official one. Don't file bugs on Fedora Project nor Red Hat.
Use dedicated forums /
warning: /f created as /f.rpmnew
表示我们现在要从 Fedora / Red Hat 的版本迁移到 Remi 版本了,所以不要去 Fedora / Red Hat 寻求帮助了。呵呵,貌似出问题都是在网上找,还真是很少到官方论坛里提问。像我这样的入门级用户,也不会遇到那么深度的问题。
安装 Zend Opcache():
yum install php-pecl-zendopcache
安装时产生的 opcache 的配置文件位于默认的 /etc/php.d 目录中:
opcache-default.blacklist
opcache.ini
这个配置文件采用的基本就是 README 中的推荐设置,只有几个地方需要修改。
vi /etc/php.d/opcache.ini
对照如下修改并保存即可(可参考):
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
不需要修改 php.ini 配置,重起 Apache 服务使之生效:
service httpd restart
查询一下看看是否正确启动了:
输出结果类似于:
PHP 5.4.14 (cli) (built: Apr 11 :35)
Copyright (c)
The PHP Group
Zend Engine v2.4.0, Copyright (c)
Zend Technologies
with Zend OPcache v7.0.1, Copyright (c) , by Zend Technologies
也许服务器上某些内容,比如正在进行调试的网站等,我们不希望对其进行 OPcache。那就可以通过黑名单来将需要例外的文件排除掉。
在 OPcache 的配置文件中有一行配置,如下,
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
该配置指定用于存储文件名黑名单的那个文件。很显然这里使用通配符 * 来指定了一系列文件而不仅仅是特定某个文件。可以一直启用这一行。等到需要排除某些文件的时候,就编辑对应的黑名单文件。例如,针对 /srv/www/sites/devSite 文件夹下的所有文件,编辑(或者新建)文件,
vim /etc/php.d/opcache-devSite.blacklist
/srv/www/sites/devSite/*
嗯,只有这么一行内容。通配符 * 表示所有 devSite 文件夹下的文件。
完了之后重新启动 php-fpm 服务就可以了。
systemctl restart php-fpm
PHP 上有不少 opcode cache 组件,如 APC、eAccelerator、XCache 等。(参见 Wikipedia 上的 。)看 PHP wiki 上的意思,这个新引入的 Zend Opcache 的性能应该是最好的。不管用哪个组件,总归是用一个才好。
对于小型的服务器,似乎这几个组件的性能差异并不太明显。我的想法是,既然用了,那就用个最好的吧。但是如果你正在使用别的 opcode cache,比如上面提到的这几个中的一个,从性能提升上讲,倒是没必要立刻就换。
对这个站,首页生成时间:仅使用 PHP 的时候,大约 0.9s;使用 eAccelerator 大约 0.63s;使用 Zend Opcache 后大约 0.55s。测试得非常简陋,多打开几次看看 WP Super Cache 提供的页面生成时间,估计一个平均数。
登录到系统里看了看 Apache 进程的内存占用。之前一个进程不多大一会儿就能占用 40MB 以上的内存,现在基本上没有高于 40MB 的了。只是不知道是 php 5.4 的功劳呢,还是 Zend Opcache 的功劳。
不知道您觉得这个 Zend Opcache 的效果如何?如果您有兴趣,不妨留言写下您的测试结果。
本文发表于。永久链接:<>。转载请保留此信息及相应链接。
标签 , , , ,
引用通告:
引用通告:
引用通告:
引用通告:
引用通告:
引用通告:
引用通告:
引用通告:
订阅 & 关注
近期评论发表在《》所以说采取什么样的缓存措施完全看需求。这里主要关注个人博客网站的缓存。发表在《》memcached 对象缓存还是比较通行的方案,毕竟很多空间或服务器的压力都在数据库这头,对象缓存可以明显改 [...]发表在《》[…] %_fillupdir macro 以方便将 /var 路径独立出来以简化 BtrFS [...]发表在《》[…] 设置开机自动配置 TrackPoint 指点杆 http://cnzhx.net/bl [...]发表在《》[…] 不让鼠标唤醒睡眠中的电脑的设置 http://cnzhx.net/blog/opens [...]php-fpm单个进程内存占用太大一般是什么原因? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
Sponsored by
咨询微信:twosecurityrefer
Promoted by
php-fpm单个进程内存占用太大一般是什么原因?
09:02:00 +08:00 · 8633 次点击
服务器整体内存占用属于正常水平,但是单个php进程竟然达到100m+,这个要从哪些方面去调整呢?
9 回复 &| &直到
18:07:35 +08:00
& & 09:05:21 +08:00
目前php-fpm的主要配置
& & 09:49:29 +08:00
装了太多模块?不需要用的 php module 可以不必加载。
& & 09:57:50 +08:00
@ 应该不是这个原因,虽然不是最精简安装,基本是默认安装/配置,没做过多修改。
& & 10:20:27 +08:00
装个xhprof分析下脚本执行情况,看内存消耗在哪一步
& & 10:39:23 +08:00
把max_request打开,应该是fpm进程一直不释放内存,打开看下吧
& & 12:37:23 +08:00
同楼上,开了max_request,fpm子进程会定期respawn
另外一般static就够用了不用dynamic吧
& & 16:29:54 +08:00
请问一下你的php版本是?
& & 17:05:39 +08:00
@ PHP Version 5.4.19-1
& &106 天前
开启了 opcache 了吧?
& · & 534 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 · 53ms · UTC 20:38 · PVG 04:38 · LAX 12:38 · JFK 15:38? Do have faith in what you're doing.PHP 5.5 以后内建了&OpCache&,&OpCache&的加速原理是把编译后的&bytecode&存储在内存里面, 避免重复编译 PHP 所造成的资源浪费.
虽然内建了, 但是默认没有启用, 下面是开启的布置, 以这套环境为例子:
Ubuntu 14.04
修改 php.ini 文件
sudo vim /etc/php5/fpm/php.ini
在文件最后面加入:
; 开关打开
opcache.enable=1
; 可用内存, 酌情而定, 单位 megabytes
opcache.memory_consumption=256
; 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值
opcache.max_accelerated_files=5000
; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒
opcache.revalidate_freq=240
重启服务器
sudo service php5-fpm restart
sudo service nginx restart
APC VS OpCache
APC 是将要被遗弃的项目, PHP 5.5 都不支持, 而在 PHP 5.5 和 5.6 版本, OpCache 是默认内建的, 并且支持 5.2 到 5.4 的安装.
如何查看效果
拥有漂亮的图形化界面的项目 :&
单文件, 方便部署的项目:&
下图是 PHPHub 开启了 OpCache 后的效果 (&&监控后台截屏 ) :
开启后的 PHP 平均响应时间不到 60ms, 之前是 120 ~ 130ms
php opcache 配置
zend_extension = "G:/PHP/php-5.5.6-Win32-VC11-x64/ext/php_opcache.dll"
; Zend Optimizer + 的开关, 关闭时代码不再优化.
opcache.enable=1
; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1
; Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB)
; 推荐 128
opcache.memory_consumption=64
; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
opcache.interned_strings_buffer=4
; 最大缓存的文件数目 200
到 100000 之间
; 推荐 4000
opcache.max_accelerated_files=2000
; 内存&浪费&达到此值对应的百分比,就会发起一个重启调度.
opcache.max_wasted_percentage=5
; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,
; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,
; 但是会对已存在的应用造成破坏.
opcache.use_cwd=0
; 开启文件时间戳验证
opcache.validate_timestamps=1
; 2s检查一次文件更新 注意:0是一直检查不是关闭
opcache.revalidate_freq=2
; 允许或禁止在 include_path 中进行文件搜索的优化
;opcache.revalidate_path=0
; 是否保存文件/函数的注释
如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释
opcache.save_comments=1
; 是否加载文件/函数的注释
;opcache.load_comments=1
; 打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高
opcache.fast_shutdown=1
;允许覆盖文件存在(file_exists等)的优化特性。
;opcache.enable_file_override=0
; 定义启动多少个优化过程
;opcache.optimization_level=0xffffffff
; 启用此Hack可以暂时性的解决&can&t redeclare class&错误.
;opcache.inherited_hack=1
; 启用此Hack可以暂时性的解决&can&t redeclare class&错误.
;opcache.dups_fix=0
; 设置不缓存的黑名单
; 不缓存指定目录下cache_开头的PHP文件. /png//public_html/cache/cache_
;opcache.blacklist_filename=
; 通过文件大小屏除大文件的缓存.默认情况下所有的文件都会被缓存.
;opcache.max_file_size=0
; 每 N 次请求检查一次缓存校验.默认值0表示检查被禁用了.
; 由于计算校验值有损性能,这个指令应当紧紧在开发调试的时候开启.
;opcache.consistency_checks=0
; 从缓存不被访问后,等待多久后(单位为秒)调度重启
;opcache.force_restart_timeout=180
; 错误日志文件名.留空表示使用标准错误输出(stderr).
;opcache.error_log=
; 将错误信息写入到服务器(Apache等)日志
;opcache.log_verbosity_level=1
; 内存共享的首选后台.留空则是让系统选择.
;opcache.preferred_memory_model=
; 防止共享内存在脚本执行期间被意外写入, 仅用于内部调试.
;opcache.protect_memory=0
/2039268.html
https://phphub.org/topics/301
阅读(...) 评论()正确使用PHP的Opcache加速模块 - 简书
正确使用PHP的Opcache加速模块
前几天一个朋友问了 PHP 中的 Opcache ,自己就去看了线上服务器的相关配置,其中的一个参数让我思索了半天,所以就详细去了解这个模块。
Opcache 对于 PHP 开发人员来说,应该是比较熟悉的,PHP 在执行的时候需要由解析器将源码转换为 byte-code,对于同一个 PHP 文件来说,假如每次执行的时候就需要转换一次,那就太影响性能了,因此出现了很多的加速模块,而从 PHP 5.5 开始 Opcache 已经成为官方标准的模块。
假如你还是个新手,就不要去了解其它的加速模块了(比如 APC),因为既然是官方的,那么性能、稳定性、适配性各方面就不用太担心了,也有一些文章比较 APC cache 和 Opcache。
对于应用层的开发者来说,只要知道 Opcache 是一个 PHP 内置的加速模块就行,当 PHP 解析器在解析一个 PHP 文件的时候,假如该文件对应的 byte-code 存储在内存中,则省去了转换过程直接执行了;反之则会编译,并将编译后的 byte-code 存入到内存中(以文件名作为索引)。
那么用了 Opcache 性能有多大的提升呢(这是应用的本质),看了一些文章列举的测试,整体的脚本响应时间最少提升 10%(取决于不同的 PHP 开发框架和具体的应用),虽然提升仅仅是几毫秒,但是对于一个大网站来说,能够极大的降低负载并且也会提高并发请求数。
不管是通过源码还是包安装,默认 Opcache 安装后是开启的,相关的参数类似于:
#/etc/php5/fpm/php.ini
validate_timestamps=1
revalidate_freq=0
memory_consumption=64
max_accelerated_files=4000
opcache.fast_shutdown=0
validate_timestamps 这个参数很重要,假如等于 0,那么 PHP 解析器只要发现内存中有对应 PHP 文件的 byte-code 内容就会加载,反应灵敏的同学可能会想,假如开发者修改了其开发的 PHP 代码,那么这个 byte-code 不就是“脏”内容吗,确实是这样的(如何解决呢?)。
假如 validate_timestamps 等于 1,PHP 解析器从内存中获取某个 PHP 文件对应的
byte-code,会通过一定的方法比较 byte-code 内容是不是最新的(读取文件系统),假如比较后发现 byte-code 已经过期,应该重新编译生成。
需要注意,PHP 解析器不是每次都会去检查(一切为了效率),检查的频率取决于 revalidate_freq 参数( 0 表示每次都检查)。
memory_consumption 这个参数很好理解,代表这块内存区开辟的大小,另外需要注意不同 PHP SAPI 内存区不是共享的,就是说同一个 PHP 文件,运行在命令行模式或者 PHP-FPM 模式下,对应的 byte-code 会存储在不同的内存区中。
max_accelerated_files 表示内存区最大能存储的 PHP 文件数量。
如何了解 Opcache 的运行状况
上面主要说了 Opcache 的定义、安装、配置、简单的运作机制,对于开发者来说,了解这些就足够了,但是可进一步了解 Opcache 到底缓存了什么,PHP 提供了一些函数(opcache_get_configuration()和 and opcache_get_status())获取配置信息和运行信息,比如了解那些文件被缓存了、使用了多少内存、内存命中率等等。
我截取了一段线上服务器的运行信息:
[opcache_enabled] =& 1
[cache_full] =&
[restart_pending] =&
[restart_in_progress] =&
[memory_usage] =& Array
[used_memory] =&
[free_memory] =&
[wasted_memory] =& 472776
[current_wasted_percentage] =& 0.13
[opcache_statistics] =& Array
[num_cached_scripts] =& 340
[num_cached_keys] =& 1071
[max_cached_keys] =& 7963
[start_time] =&
[last_restart_time] =& 0
[oom_restarts] =& 0
[hash_restarts] =& 0
[manual_restarts] =& 0
[misses] =& 352
[blacklist_misses] =& 0
[blacklist_miss_ratio] =& 0
[opcache_hit_rate] =& 99.
[scripts] =& Array
[/usrPincode.php] =& Array
[full_path] =& /usr/Pincode.php
[hits] =& 0
[memory_consumption] =& 323800
[last_used] =& Sun Feb 12 06:16:14 2017
[last_used_timestamp] =&
[timestamp] =&
也有一些可以更直观的获取运行信息。
validate_timestamps 指令
其实写这篇文章,主要是为了了解这个指令,文档上建议生产环境不开启,开发环境不开启。
不开启的意思就是不校验 PHP 文件最近有没有修改过,主要是为了效率(参考前面讲的),那么如何解决文件更新带来的问题呢(让它保持最新),有两种方法:
第一种方法就是调用 opcache_reset() 函数,第二种重启 PHP SPAI,比如运行service php5-fpm restart等。
但是上面两种方式都太凶残,假如开发的项目频繁上线,每次缓存区都要全部清空,可以使用opcache_invalidate()函数更新特定文件的缓存。
不管那种方式,为了清除失效的 byte-code,在部署代码的时候必然会有一些麻烦,可以写一些脚本来做到自动化更新缓存。
关闭这个指令的好处:
不用频繁读取文件系统(校验内存中的 byte-code 是不是最新的)
同个文件不会缓存多份(因为某个文件 byte-code 并不会因为过期而释放内存区)
另外推荐这篇,说的比较详细。
PHP Python 程序员
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
Java 基础思维导图,让 Java 不再难懂 - 工具资源 - 掘金思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具。了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的时候一目了然,快速知道自己的短板。 思维导图...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
一. Java基础部分......................................................................................................21、一个&.java&源文件中是否可以包括多个...
如何优雅的使用 phpStorm - 后端 - 掘金按照惯例依然是从百科上复制一条简介: PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具。PhpStorm可随时帮助用户对其编码进行调整,运行单元测试或者提供可视化debug功能和智能HT...
初衷来的很简单,一切源自于今早我和对象的一顿干架。 我们恋爱三年,分分合合三回,最终还是没有逃离彼此的魔掌。用他的话说,是“彼此历经验证过的真爱”。 然而,正是眼前的这个真爱,让我如今气愤到特意开个账号吐槽。 我们之间有个习惯,每天都会从家一起出发,然后他会把我放在他公司附...
背景:曾国藩的六弟有志有才,却在考场上屡战屡败,为此抑郁牢骚不断。曾国藩在与诸弟的家书中做出如下回应
六弟自怨数奇,余亦深以为然。然屈于小试,辄发牢骚,吾窃笑期志之小而所忧之不大也。君子之立志也,有民胞物与之量,有内圣外王之业,而后不忝于父母之所生,不愧为天地之完人。故其...
这四大因素是动机、知识点、能力和环境 1、 动机 2、 知识点 3、 能力
养花这些年,你见过最奇葩的花是什么呢?有没有讲过下面这些奇葩的花卉呢?反正蓝妖养了这么些年花,是没有见过,赶快一起来看看吧! 蒲包花独叶草,玄参科蒲包花属布袋花,拉丁学名:Calceolaria uniflora,高山植物。 草帽裸舞男,学名Orchis Italica。 ...
(第三章 “中国逻辑”曲线) 第三节
“无为而治”的探索【三】 【文景之治】 仁弱的惠帝在位时受制于强势的母后,而且英年早逝。他一走,老妈吕雉弄了个小皇帝说是惠帝的儿子,后来废了另立,由自己临朝称制。她大力培植娘家势力,打击开国勋贵和刘氏诸王,一时大家惶惶然。公元前180...安装PHP加速插件ZendOpcache
<span type="1" blog_id="1953352" userid='
分享到朋友圈
喜欢我的文章,请分享到朋友圈

我要回帖

更多关于 phpfpm内存 的文章

 

随机推荐