【问题标题】:Memcache running out of memory for PHP sessions用于 PHP 会话的 Memcache 内存不足
【发布时间】: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


    【解决方案1】:

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

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

    更新:我还要补充一点,如果您喜欢使用 cookie,那么使用有时间限制的 cookie 来重新创建已删除的会话也是一个不错的补充。基本的“保持我的登录状态”code should suffice

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 2010-11-14
      • 2014-01-29
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2021-12-13
      相关资源
      最近更新 更多