PHP在高负载时无法连接到memcached


php unable to connect to memcached at times when under high load

我遇到了一个非常令人沮丧的问题,我想不出来。

我有一个网站,每周流量高峰一次。它在PHP上运行,使用memcached缓存某些数据。当它达到峰值时,我看到memcache达到600+ req/s。这就是问题发生的时候。它时不时地抛出一条消息,告诉我PHP无法连接到memcache。这将导致我的页面显示随机的空白页。

我还想指出memcache并没有使用太多的空间。只有大约30MB。我遇到过一种情况,PHP多次访问同一个缓存对象。我还注意到,如果缓存中的同一个对象被多次访问,它的加载速度会比另一个不经常访问的对象稍慢。

其他注意事项:我在同一台机器上托管mysql, memcache, php-fpm和nginx。服务器似乎没有处于高负载下,因为它使用了大约20-35%的CPU,并且具有负载平均值<6、有足够的空闲内存

这只是一个粗略的假设,因为您的站点信息非常稀疏。但听起来你会碰到maximum number of open files。或者其他类似的限制

显示您盒子上的参数(打开文件的最大数量的硬限制和软限制)

ulimit -Hn
ulimit -Sn

另一种可能是您没有在memcached配置中正确配置最大并行请求数。

memcached帮助:

-c       max simultaneous connections (default: 1024)

您使用的是什么架构?CentOS吗?在版本6中,对/etc/security/limits.conf进行了一些更改(默认情况下,文件/etc/security/limits.d/90-nproc.conf覆盖了最多1024个文件)。你需要创建一个像'/etc/security/limits.d/99-memcache.conf'这样的新文件,内容如下:

* soft nofile 4096
* hard nofile 10240

由于此limits.d文件夹中的文件是按字母顺序处理的,因此这将覆盖1024限制,但在下次进行主要操作系统更新时不会引起问题。