【发布时间】:2015-04-18 13:19:57
【问题描述】:
我在 AWS 中有一个 Web 层,运行 Nginx+PHP-fpm,使用 ElastiCache 上的 memcache 进行会话。在过去 6 个月左右的时间里,我们遇到了一个非常奇怪的问题,即每隔 6 周左右,ElastiCache 节点就会耗尽内存并开始驱逐密钥,这导致一些用户失去会话、被注销和退出当然感到沮丧并在应用程序中失去了自己的位置。
我已经尝试了几件事。一种是利用 ini 中的 php-memcached 模块:
session.save_handler = memcached
session.save_path = "<aws elasticache dns:port>"
是的,我验证了我实际使用的 save_path url 是正确的并且正在接收网络连接。我还通过 CloudWatch 指标验证了缓存节点确实在接收网络连接和数据。
此配置不起作用,因此我将其替换为 Zend 框架会话管理器和保存处理程序。我通过phpinfo() 验证了session.save_handler 被设置为user 并且还验证了浏览器正在获取我在Zend 会话中配置的正确cookie。
不过,我们遇到了与以下 CloudWatch 屏幕截图所示相同的问题:
我相信内存中的垂直峰值是由于 memcache 清除过期的键,这似乎每 24 小时发生一次。最后一个(最右边)尖峰是我重新启动节点的地方。奇怪的是,每次它清除键时,它都不够清除。我们最终会看到可用内存的最终下降趋势,这在某些时候会导致内存用完并且 memcache 开始驱逐键。
我不知道可能是什么问题以及接下来要尝试什么以进行调试。有什么想法吗?谢谢!
【问题讨论】:
标签: php zend-framework memcached amazon-elasticache