为LNMP开启Memcached内存缓存以加速网站

最近服务器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插件的朋友,还可以到高级选项里面勾选“使用对象缓存系统来存储缓存文件”,如图:

2016-03-26_223217

如果你的网站不是访问量非常大,并不特别强调交互功能(比如在线购物、预订、论坛等)的话,建议不要为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 显示帮助

One thought on “为LNMP开启Memcached内存缓存以加速网站

  1. 补充:因为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 服务端的数据。

发表评论

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