W3TotalCache中Database Cache和Object Cache区别

Posted on1 CommentCategories技术文章

最近在公司解决一次AWS RDS CPU占用率100%事件。起因是产品经理发现我们的站点S搜索功能不工作了。当然看到邮件正常内心OS是:

又开始胡说八道了。最近没发布,怎么就不工作了。一定是手法问题。哈哈哈。

首先看了下Cloud Watch,哟哟,不知道什么原因,从6月1日开始居然流量上升了60%+。还有这种事情。Okay,再看看AWS RDS,小吃一惊,CPU使用率100%,数据库连接直逼300个。这尼玛什么操作。

RDS的general log和slow log都没开启,也不明白具体在发生些啥。CPU使用率这么高,也不敢乱动。当务之急是想办法把CPU使用率降下去。

前前后后考虑过下面的东西:

  • 分析access log, 找到了一些搜索引擎爬虫拼了命的爬网站,于是设置了robots.txt的Crawl-delay参数
  • 将一些典型的攻击URL重定向到主页 (这个挺有意思的,不知道攻击者用什么软件,拼命的在正常URL里拼接了一些字符,导致了完全不命中缓存)

上面两个事情做完,发现然并卵。CPU还在那不下来。

都差不多开始考虑是不是当前RDS配置不够应付当前流量了。然后好不容易挤着100%CPU登录进WordPress后台一看,W3TotalCache配置是: Database Cache开启, Object Cache关闭。

这尼玛什么意思?这当初是IT配置的,现在IT都离职了,没人知道他为什么这么配置了。那么问题来了:

  1. Database Cache顾名思义,是缓存数据库的,那为毛数据库连接直逼300个?没起作用?
  2. 如果Database Cache是缓存数据库,那么Object Cache又是什么东西?

Google了一圈,没找到什么有用的信息。既然如此,那就看代码吧。

DbCache_WpdbInjection_QueryCaching::query里面的代码,我们可以看到,这个缓存是基于mysql语句的。并且有大量的条件导致这个语句不能够被缓存。你甚至可以自己定义一些规则来判断是否去缓存这个语句。(配置dbcache.reject.words等)

w3tc-dbcache-query

换句话说,你做一个操作,get_option, 假设它调用了20个mysql query,但很不巧,里面有15个是不符合缓存规则的,那你这个操作,并没有省太多什么事。

Object Cache就不一样了。同样的例子,你调用get_option,  只要你的cache key存在,你里面就从内存里取出缓存了。一个mysql query也不去访问mysql了!WordPress自己定义了Object Cache框架,但是它仅仅在一个http访问内是缓存住的;基于此,W3TotalCache用Memcached实现的object cache,是跨http请求的。因此十分高效。

明白了这一点,解决问题没啥好说了。关掉Database Cache(不关也行),开启Object Cache。

效果如下图。

database-connections-change-after-turn-on-object-cache

1 thought on “W3TotalCache中Database Cache和Object Cache区别”

发表评论

电子邮件地址不会被公开。 必填项已用*标注