最近服务器CPU经常跑到100%搞得网站慢得要死,初步判断是由于对MySQL数据库操作太频繁导致服务器资源消耗过大造成的。网站已经安装了WP Super Cache对页面文件进行了缓存,而数据库方面就没有做缓存优化,所以,接下来就需要对数据库缓存做适当的优化了。
下载 Memcached Object Cache https://wordpress.org/plugins/memcached/
将压缩包解压,得到object-cache.php这个文件,然后将其上传到 /wp-content/目录下。
幺蛾子出来了......,刷新网站竟然出现了500错误,前后台都进不去了。出现500错误不要着急,可以通过打开wordpress的debug模式查看具体的错误信息,先删除/wp-content/目录下的object-cache.php,然后下载根目录下的wp-config.php,找到
define('WP_DEBUG', false);
将false改为true,然后上传到服务器,再将object-cache.php上传到 /wp-content/目录下,刷新网页返回错误信息如下:
Fatal error: Class 'Memcache' not found in /wp-content/object-cache.php on line 380
这是由于服务器没有安装Memcache造成的。原来LNMP一键安装包中提供了Memcached安装脚本,安装时会让你选择安装Memcache还是Memcached,由于我安装了Memcached,所以才造成Wordpress启用Memcache后服务器返回500错误。那么,现在需要将Memcached卸载,然后安装Memcache。
首先,卸载服务器上的Memcached,命令如下:
cd lnmp1.2-full
./addons.sh uninstall memcached
然后,安装memcache,
./addons.sh install memcached
这次认真点,选1,也就是memcache (其实,如果不是对集群有要求的话,memcache就够了)
安装完毕。将object-cache.php这个文件再次上传到 /wp-content/目录下,再刷新网页,页面就正常了。
WordPress 会自动检查在 wp-content 目录下是否有 object-cache.php 文件,如果有,直接调用它作为 WordPress 对象缓存机制。
安装了WP Super Cache插件的朋友,还可以到高级选项里面勾选“使用对象缓存系统来存储缓存文件”,如图:
如果你的网站不是访问量非常大,并不特别强调交互功能(比如在线购物、预订、论坛等)的话,建议不要为wp super cache开启对象缓存,让wp super cache仅仅为网站输出纯净态页面,对你网站的访问速度帮助更大。因为wp super cache+对象缓存的开启会牺牲页面静态化这个重要的加速功能,将缓存负载转移到内存,这样反而加大了内存的压力,对于小内存(小于1G)的主机来说,加速效果不升反降。
WordPress 站点开启了 memcached 缓存以后,数据库缓存已经生效。
查看 Memcached 缓存情况
(这部分参考胡畅萌的博客)我们需要使用 telnet 命令查看,首先检测一下是否已安装 telnet 包,在终端里执行:
rpm -qa |grep telnet
如果安装了,会返回相关版本
telnet-server-0.17-59.el7.x86_64 telnet-0.17-59.el7.x86_64
如果没有安装,运行下面的命令,注意在root下安装:
yum install xinetd
yum install telnet
yum install telnet-server
特别说明:telnet服务要依靠xinetd服务启动,所以要先安装xinetd服务。所以我们要先安装xinetd,再安装telnet-server。
然后链接到 telnet 服务
telnet 127.0.0.1 11211
如果链接成功,会返回:
Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
然后输入:
stats
回车,就可以看到 Memcached 的缓存情况:
STAT pid 619 STAT uptime 4807 STAT time 1459003259 STAT version 1.4.22 STAT libevent 2.0.21-stable STAT pointer_size 64 STAT rusage_user 0.147705 STAT rusage_system 0.187863 STAT curr_connections 14 STAT total_connections 16 STAT connection_structures 15 STAT reserved_fds 20 STAT cmd_get 7059 //总共获取数据的次数(等于 get_hits + get_misses ) STAT cmd_set 1805 //总共设置数据的次数 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 5623 //命中了多少次数据,也就是从 Memcached 缓存中成功获取数据的次数 STAT get_misses 1436 //没有命中的次数 STAT delete_misses 43 STAT delete_hits 66 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 4514343 STAT bytes_written 17749020 STAT limit_maxbytes 67108864 //总的存储大小,默认为 64M STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT malloc_fails 0 STAT bytes 2703251 //当前所用存储大小 STAT curr_items 1345 STAT total_items 1506 STAT expired_unfetched 0 STAT evicted_unfetched 0 STAT evictions 0 STAT reclaimed 0 STAT crawler_reclaimed 0 STAT lrutail_reflocked 0 END
以上数据的命中率:5623/7059 = 79.657% 命中率一般,可能是刚安装,样本太少的缘故。
如果你要清空现有数据,可以使用下面的命令:
stats reset
要退出 telnet,输入组合键 Ctrl+] 出现
telnet>
输入 quit 即可退出。
1.关闭Memcached
直接使用 kill 进程ID 即可,比如上面信息显示的进程ID为619,那就使用 kill 619
2.重新启动Memcached,并且修改内存等参数,样例如下(修改最大内存为 1024M,最大连接数为 4000):
memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211 -c 4000 -P /tmp/memcached.pid 11211
更详细的有些参数介绍如下:
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
补充:因为php-memcached扩展功能上还是比php-memcache扩展强大一些,如果服务器上安装的是php-memcached扩展想要开通Memcached 内存缓存也是可以的。选择另外一个obeject-cache.php也能实现内存缓存的功能。我们需要用到的插件是 MemcacheD Is Your Friend,点这里下载
这个插件会自动帮你安装 WordPress 所需要的 object-cache.php 到 wp-content 目录下。
Memcache 和 Memcached 存取数组的时候是不兼容的,也就是说 Memcache set 的数组,Memcached get 出来是有问题的。这时候会报一个 waring:could not read long value, too big。
另外 Memcached 的一致性 hash 策略和 Memcache 并不一致,还会导致某些数据永远无法 delete 掉,就会产生了垃圾数据。总之为了迁移之后工作顺利,最好清除 Memcached 服务端的数据。