我们的 memcache 安装最近开始删除密钥,但我们不确定原因。大量密钥同时消失。
Memcache 报告称驱逐率很低甚至不存在,而且我们的应用无法清除 memcache(它只能删除特定的键)。甚至应用不了解的键也会被删除,因此我们确信它们已经过期。但是,我们的 memcache 配置已经有一段时间没有被触碰过了。
之前有人调试过这样的问题吗?如果是,你建议我们采取什么措施吗?memcache 的过期策略有多灵活 - 我们是否可能突然遇到基于(比如说)对某个键的写入频率的标准?
答案1
即使您已将 Memcached 中的密钥设置为永不过期,如果 Memcached 已填满,记录也会根据最近最少使用的情况被删除。基于 slab 的标准存储机制将记录存储在从 1Mb 大小的 slab 分配的固定大小的块中。虽然这很快,但这也意味着 Memcached 最终会浪费大量内存。一旦分配了 slab 来保存特定大小的块,我认为这些块的大小就无法调整了。如果缓存了大对象和小对象的混合,并且组合随着时间的推移而发生变化,那么如果只有这些块可用,那么 memcached 最终可能会将小对象存储在更大的块中。
这是 gear6 (www.gear6.com) 和 northscale (www.northscale.com) 等公司在其 Memcached 发行版中解决的问题之一。
答案2
事实证明,这是因为应用程序部署时留下了一些调试代码。
调试代码手动调用Memcache::flush。
我认为这个故事的寓意是:“任何时候你说‘这不可能是应用程序’,你可能都错了。”你可能会认为当我问这个问题时我就已经知道了这一点,但显然,我需要时不时地提醒一下。