OPcache 配合软链接发布的一个疑问,希望懂的人帮忙解答一下

2020-07-17 09:51:46 +08:00
 mitu9527

如果一个项目开启了 OPcache,但是不启用预加载,同时该项目使用的是软链接到新目录的方式发布新版本。

因为 OPcache 使用的是文件路径来标识缓存,由于软链接到了新的目录,所以文件路径变了,那不就要重建全部的缓存,不就是缓存雪崩了么?就算开启了 OPcahce 的 file cache 好像也帮不上忙,因为 file cache 也是基于文件路径的。

问题一:是不是真的就会缓存雪崩? 问题二:除了换成覆盖式发布,还有办法解决么?

2545 次点击
所在节点    PHP
26 条回复
rushssss
2020-07-17 10:22:20 +08:00
第一缓存雪崩不是这个意思,第二你更新了代码但是 OPcache 不更新跑的不就是原来的代码了? 那更新代码有啥意义
mitu9527
2020-07-17 10:28:04 +08:00
@rushssss 这个不是缓存雪崩么,那是啥?第二点,代码发布到新目录下,所有文件的路径全部变了,OPcache 中现有的缓存全都是以前的路径的,也用不到了,相当于自动作废了,不是么?然后这时候去访问新版本,不就相当于从头开始建缓存么?
yc8332
2020-07-17 10:33:40 +08:00
你在说什么?先把概念搞清楚再发帖吧
mitu9527
2020-07-17 10:34:52 +08:00
@yc8332 我去改一下
simapple
2020-07-17 11:01:49 +08:00
你是要做什么?让不同机器的 php 进程复用同一份 opcache ?
mitu9527
2020-07-17 11:09:53 +08:00
@simapple 就是想问一下,使用软链接到新目录的方式发布新版本,旧的 OPcache 缓存就全部失效,就相当于从头建缓存,在高流量的服务器上压力不就瞬间上来了?想问一下有没有什么办法解决。
yc8332
2020-07-17 11:40:04 +08:00
opcache 的缓存也是有时间的。并不是说你代码更新了马上就更新,更新也不是全部都更新,用到才会更新。。而且这个也不是什么缓存击穿、缓存雪崩。。。那个是相对应缓存系统来说的,有兴趣可以自己搜索一下
mitu9527
2020-07-17 11:45:34 +08:00
@yc8332 OPcache 也算是缓存,怎么不能用这些词啊,有人规定这些词只能用在 redis 和 memcache 上?再者,你确定你理解我在问什么了么?我看不是我讲的不够清楚,是你没理解。
hauzi
2020-07-17 11:46:52 +08:00
先把常用的 PHP 脚本预热下
mitu9527
2020-07-17 11:50:37 +08:00
@hauzi 我明白预加载可能解决这个问题,但是不是所有项目都能预加载,而且预加载是把缓存放在工作进程上,也不是所有内容都适合预加载,所以我才问不启用预加载的情况下,有没有办法解决这个问题。
yc8332
2020-07-17 11:53:18 +08:00
@mitu9527 opcache 不会马上都更新,你觉得你的 php-fpm 进程一开始,服务器的处理能力会影响到你的 qps 吗?如果不会,更新代码也不会有这个问题。
mitu9527
2020-07-17 11:58:03 +08:00
@yc8332 请求一个新文件,不会去更新?高并发场景下,多人同时去读取这个文件,然后尝试去把这个文件的字节码写到 OPcache 中,那个瞬间,CPU 压力不就爆了?
coosir
2020-07-17 12:08:35 +08:00
更新代码后,主动清一下 opcache
mitu9527
2020-07-17 12:12:57 +08:00
@coosir opcache 被重置后,不也是相当于任何缓存都没有了,效果不也和缓存雪崩一样了么?瞬间压力就上来了。
loveyu
2020-07-17 12:43:31 +08:00
看了上面的。楼主安心摘流量,然后一点点放量吧,这样就没这些问题。

还要,清缓存就是了,并发读文件建缓存那点压力,忽略吧
mitu9527
2020-07-17 12:56:32 +08:00
@loveyu 高并发下重建缓存那个瞬间,压力比不开启 OPcache 直接去读 PHP 源文件还要大,直接不管了么?我觉得这个点可能是 PHP 压力的最高点,最有可能撑不住的就是这个点,所以才想问。
coosir
2020-07-17 13:17:29 +08:00
@mitu9527 真有这么大流量那就是很多个实例来支撑,那么就不应该热更。
就像上面说的,发布的时候部分实例先摘掉下线,更新代码,预热好,再上线。逐步更新所有实例防止服务中断。
mitu9527
2020-07-17 13:24:18 +08:00
@coosir 明白了,谢谢!
gantleman
2020-07-17 13:37:21 +08:00
@mitu9527 缓存服务重置后,重建缓冲存是否会导致后端压力过大。通常情况下外网带宽远远小于内网带宽,内网带宽远远小于硬盘 io 。所以一般情况下不存在击穿或雪崩。有一种特殊情况,就是所有外网带宽持续集中在一点,外网带宽总和大于磁盘 io 。例如产品活动的特殊情况。然后缓存服务器故障重置,压力突然后移到 io 。进而导致拒绝服务。

出现这种情况首先有一个必要条件,就是外网带宽大于磁盘 io 。当前服务器磁盘 io 一般速度为 500m 每秒。单台服务外网带宽约为 24m 。大概是大于 20 台主机的集群规模。那么这 20 多台服务器接到请求不做任何处理直接转发给同一台服务器。并且那台服务器缓存重置出现雪崩。

第二服务器读写数据有 28 定律,20%为写入操作,80%为读取操作。出现雪崩也就是对于 80%的读取操作不做 CDN 加速。如果有 cdn 加速,雪崩的条件就要上升到 100 台服务器同时写入并内存重置。 也就是需要外网带宽要高达 2400m,才可能触发雪崩。这里还没考虑限流措施。

雪崩有存在的可能,但在实际运维的条件下,要达到雪崩的条件非常苛刻。
wangritian
2020-07-17 13:54:56 +08:00
如果你真的担心大流量,优化业务逻辑为先,用好 redis,然后做负载均衡+多台部署,时间允许的话,底层代码换 swoole 协程,最后上一套 k8s 做好自动部署

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/690789

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX