摘要:昨晚线上出故障,紧急处理切换容灾后缓解了故障,解决故障后从容灾切换回正式服务时发现文件更新无效,重启后才生效。查看昨晚的日志,更新不生效持续时间远远大于秒,所以这个检测间隔时间的问题可以了,我们继续。
昨晚线上出故障,紧急处理切换容灾后缓解了故障,解决故障后从容灾切换回正式服务时发现PHP文件更新无效,重启FPM后才生效。下面记录复盘追查的过程。
因为是PHP文件更新不生效,所以马上怀疑到opcache上面,到线上看了一眼php.ini,果然使用了opcache,并且检测间隔时间设置为60秒。查看昨晚的日志,更新不生效持续时间远远大于60秒,所以这个检测间隔时间的问题可以PASS了,我们继续。
在线上环境查看更新的文件和日志中的时间的时候,突然发现PHP文件时间和日志中的时间对应不上,马上找OP确认,OP交待说这个文件是回滚mv回来的,所以文件时间和我预期的不一致。我用stat命令看了一下,果然modify time相比access time早了一段时间,依据这点线索推测opcache依靠的是PHP文件的modify time作为文件被修改的检测条件。在线下复现问题,填坑成功!
下面总结一下填坑过程中查的一些相关的知识点
加载opcache在php.ini中增加opcache时需要使用zend_extension,而不是extension,不然会得到以下WARNING
PHP Warning: PHP Startup: Invalid library (appears to be a Zend Extension, try loading using zend_extension=opcache.so from php.ini) in Unknown on line 0配置opcache
使用下列推荐设置来获得较好的性能:
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
本次涉及到的有两个参数
revalidate_freq,默认2
检查脚本时间戳是否有更新的周期,以秒为单位。 设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新
validate_timestamps,默认1
如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数 检查脚本是否更新。 如果禁用此选项,你必须使用 opcache_reset() 或者 opcache_invalidate() 函数来手动重置 OPcache,也可以 通过重启 Web 服务器来使文件系统更改生效。
access time 表示我们最后一次访问文件的时间
modify time 表示我们最后一次修改文件的时间
change time 表示我们最后一次对文件属性改变的时间,包括权限,大小,属性等等
C/C++中也可以使用stat方法查询文件的这3个时间属性,一般应用都会通过modify time判断文件是否更新,我们本次踩坑就是因为文件是mv操作的,modity time没有更新,所以opcache没有更新。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/30307.html
摘要:当这个选项被启用设置为,会在设置的时间到达后检测文件的时间戳。设置值取值范围最小值是,最大值在之前是,及之后是。这个选项的值是以兆字节作为单位,如果把它设置为,则表示,默认是,这是一个比较低的值。 在网上无意中看到的一篇文章,这哥们非常简洁地谈论了zend opcache的最佳设置,他说他为此花了大量的时间探索zend opcache的每个设置选项的细节,甚至是阅读它的源代码,并且在自...
摘要:业务和架构不分家,架构是建立在对业务的理解之上的。主键最好保持顺序递增,随机主键会导致聚簇索引树频繁分裂,随机增多,数据离散,性能下降。没有索引的更新,可能会导致全表数据都被锁住。 本博客并非全部原创,其实是一个知识的归纳和汇总,里面我引用了很多网上、书上的内容。也给出了相关的链接。 本文涉及的知识点比较多,大家可以根据关键字去搜索相关的内容和购买相应的书籍进行系统的学习。不对的地方...
摘要:配置为时,会根据设定的值检查更新代码设置为时,永不检查。避免上传代码造成系统的不稳定。三推荐配置开发模式下推荐,直接禁用扩展更好多台机器集群模式或者代码更新频繁时推荐,可以兼顾性能,方便代码更新稳定项目推荐,性能最好参考 OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。 一...
摘要:什么是当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码,。的目地是避免重复编译,减少和内存开销。这将带来显着的性能加速,通常特别是高流量和高并发量时降低了整体服务器的内存消耗,而且很少有缺点。 一、个人实践发现opcache 最近为了应对双十一期间高流量的冲击,小编通过压力测试去查找服务器性能瓶颈,发现100并发时,QPS并不是很高,但CPU和内存消耗特...
阅读 1546·2023-04-26 01:54
阅读 1570·2021-09-30 09:55
阅读 2605·2021-09-22 16:05
阅读 1764·2021-07-25 21:37
阅读 2600·2019-08-29 18:45
阅读 1868·2019-08-29 16:44
阅读 1864·2019-08-29 12:34
阅读 1326·2019-08-23 14:02