(我在这个论坛上搜索了几个小时,找到了一些主题,但没有一个对我有用)
我使用的Wordpress带有:Varnish+Nginx+PHP-FPM++APC+W3总缓存页面速度。
当我使用Varnish时,第一次调用www.mysite.com时,它只占用了10%的CPU。第二次调用时,它将被缓存。问题是在URL中传递请求参数。
对于仅一个请求(www.mysite.com?1=1),它显示在top
:中
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7609 nginx 20 0 438m 41m 28m S 11.6 7.0 0:00.35 php-fpm
7606 nginx 20 0 437m 39m 26m S 10.3 6.7 0:00.31 php-fpm
页面完全加载后,上面的这些进程仍然处于活动状态。2秒钟后,它们被另外2个php fpm进程(如下)所取代,这些进程将激活3秒钟。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7665 nginx 20 0 444m 47m 28m S 20.9 7.9 0:00.69 php-fpm
7668 nginx 20 0 444m 46m 28m R 20.9 7.9 0:00.63 php-fpm
40%CPU仅用于1个未缓存的请求!
奇怪的事情:
- 加载页面后CPU使用率更高
- 当我清除缓存(W3和Varnish)时,只需要10%的CPU就可以加载未缓存的页面
- 这种高CPU使用率只是通过请求参数或在Wordpress Admin中发生的
当我尝试执行10请求时(按F5键10x),服务器停止服务,并在php fpm日志中显示:
警告:[pool www]服务器已达到max_children设置(10),请考虑将其提升为
我把这个数值提高到20,同样的问题。
我使用的是pm=ondemand
(pm.max_children=10
和pm.max_requests=500
)。
初始I使用pm=dynamic
(pm.max_children=10
、pm.start_servers=1
、pm.min_spare_servers=1
、pm.min_spare_servers=2
、pm.max_requests=500
),也发生了同样的问题。
有人能帮忙吗?任何帮助都将不胜感激!
PS:
- APC开启(98%命中,2%未命中)
- 服务器Amazon Micro(613MB RAM)
- PHP 5.3.26(fpm-fcgi)
- Linux版本3.4.48-45.46.amzn1.x86_64 Red Hat 4.6.3-2(我认为它基于CentOS 5)
首先减少缓存堆栈。既然你已经在使用w3缓存,那么为什么还要使用从内存提供页面服务的清漆呢?
W3cache占用大量CPU!它不仅可以缓存项目,还可以动态压缩、缩小和合并文件。
你的机器上总共有512MB的内存,这并不算多,而且你的CPU功率也低于现代智能手机。由于xen虚拟化层的原因,与根服务器相比,内存访问非常慢——这就是为什么少即是多。
请确保w3cache设置正确,这样它就可以真正缓存项目,然后预热您的缓存,您就可以了。
看看谷歌的nginx页面速度模块https://github.com/pagespeed/ngx_pagespeed,它可以做与w3cache相同的事情,只是效率高得多,因为它发生在Web服务器中,而不是在PHP 中
Nginx也可以直接从memcached服务http://www.kingletas.com/2012/08/full-page-cache-with-nginx-and-memcache.html(示例文章,可能需要更多的调查)
问题解决了!
对于那些有同样问题的人:
-
检查清漆配置;
-
检查Wordpress的插件;
1) 在我的案例中,没有在Varnish中配置TTL,所以没有缓存任何内容。这个配置对我有效:
sub vcl_fetch {
if (!(req.url ~ "wp-(login|admin)")) {
unset beresp.http.set-cookie;
set beresp.ttl = 48h;
}
}
2) 页面加载后的高CPU使用率是由Wordpress插件"Scroll Triggered Box"引起的。
页面加载后,它正在进行一些AJAX操作。我禁用了那个插件,高负载停止了。
这里有两个因素在起作用:
-
您使用的微型实例具有可中断的CPU配置文件。它可以爆发到2个ECU,然后限制在远小于1的范围内(一些估计大约为0.1-0.2个ECU)
-
当以管理员身份登录时,wordpress缓存插件通常会绕过或减少缓存。如果您想一直打开缓存,W3应该允许您切换此选项。