Memcache内存耗尽PHP会话

时间:2015-02-17 18:21:26

标签: php zend-framework memcached amazon-elasticache

我在AWS中运行Nginx + PHP-fpm的Web层,使用ElastiCache上的memcache进行会话。在过去的6个月左右的时间里,我们遇到了一个非常奇怪的问题,即大约6周左右的时间,ElastiCache节点耗尽内存并开始驱逐密钥,导致一些用户失去会话,被注销以及当然感到沮丧并且失去了他们在应用程序中的位置。

我尝试过几件事。一个是在ini中利用php-memcached模块:

session.save_handler = memcached
session.save_path = "<aws elasticache dns:port>"

是的,我确认我实际使用的save_path网址是正确的并且正在接收网络连接。我还通过CloudWatch指标验证了缓存节点确实正在接收网络连接和数据。

此配置不起作用,因此我将其替换为Zend框架会话管理器和保存处理程序。我通过phpinfo()验证了session.save_handler已设置为user,并且还验证了浏览器获得了我在Zend会话中配置的正确Cookie。

尽管如此,我们遇到了与以下CloudWatch屏幕截图中所示相同的问题:

cloudwatch metrics for memcache node

我相信内存中的垂直尖峰是由于memcache清除了过期密钥,这似乎每24小时发生一次。最后一个(最右边)尖峰是重新启动节点的地方。奇怪的是,每次清除键时,它都不够清晰。最终我们的可用内存最终呈下降趋势,这在某种程度上会导致内存耗尽,而memcache会开始驱逐密钥。

我不知道可能出现什么问题以及为了调试而尝试下一步的内容。有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

这不是一个错误,只是Memcached应​​该如何工作。根据作为缓存的本质,数据应该(相对)短暂。如果您当前节点没有足够的内存来支持您尝试存储的所有值,则它别无选择,只能驱逐密钥。如果您只是存储会话并且您正在填写整个缓存实例,那么您最好的选择是升级缓存节点的大小(这就是很多会话!),或者AWS案例,添加另一个节点。

如果您还要在缓存节点上存储其他数据,请为这些项设置智能到期时间,以便它们过期并定期释放空间。

更新:我还要补充一点,如果您对使用Cookie感到满意,那么使用时间限制的Cookie来重新创建已删除的会话也是一个很好的补充。基本&#34;让我登录&#34; code should suffice