Memcached中短超时的性能开销


Performance overhead of short timeouts in Memcached

我想知道memcached中的短超时(60秒)是否会对性能产生负面影响,而不是更长的超时,但会忽略返回值(如果它存储在60秒以上)。

大量缓存未命中(如果项目已被删除)会对性能产生影响吗?

快速提示:如果有缓存未命中,我不会重新设置值,只是检查它的存在

示例场景:

考虑一个案例,在您的网站上,您确实希望防止双重行为(例如,在您网站上的PAY按钮上点击两次,即可注册两次付款。在我们的案例中,我们不处理付款)。

一个简单的技巧是将用户操作短时间保存在Memcached中——当然还有更好的方法——并检查在最后几秒内是否进行了相同的调用。

现在,您可以在短时间内设置缓存,并检查缓存中是否存在针对用户的相同操作。或者,将last_user_action缓存设置为长时间,同时设置操作的时间,应用程序可以根据预期时间段检查时间。

短时间内的警告是有大量缓存删除(过期的密钥)和大量缓存未命中(因为项目已被删除)。更长的时间只会占用更多的内存。

因此,我想知道大量删除(过期元素)和缓存未命中的开销。

不要对懒惰的平板撒谎

你的超时应该与你的应用程序想要返回条目的超时完全匹配(只要你在1-2秒的不确定性下还可以。)如果多个条目同时过期,你不会显著增加memcache内部遇到的缓存未命中量,也不会导致某种形式的阻塞。但您将允许memcache停止处理和返回您的应用程序只需要丢弃的项目。

您可以在监控中找到memcached行为的描述:为什么curr_items在项目过期时不减少?从本质上讲,它对过期的条目没有任何作用,相反:

遇到过期项目:

  • 获取

    不要退货并标记为免费

  • 存储

    总是先运行get逻辑,所以现在它可以重用项目的空间

  • LRU逐出(由存储在完整缓存上触发)

    不要增加驱逐统计数据,因为这个项目已经过期。

Motivated Slab Crawler寻求CPU和锁争用

常见问题解答中没有提到您现在可以选择有一个LRU爬网线程,但slab分配器的本质是,该线程"释放"过期条目的开销相对较小,并且通过简化后续遍历来回报工作。

别忘了memcache是LRU缓存

  1. 始终警惕触发不需要的LRU驱逐:

    • 如果您也共享具有类似大小但寿命更长的条目的缓存,您可能会导致它们被驱逐(这是可选爬网程序旨在防止的。)

    • 如果允许ops * seconds * slab_size(entry)接近缓存大小,则条目将在过期日期之前开始消失。

    但您可以在驱逐统计数据中观察到这一点,并可以使用人工流量和/或按比例减少的缓存空间进行测试。

  2. 如果它重新启动,(或者您的配置更改,或者在应用程序实例之间不同步,或者…?)您可能找不到缓存用例中没有问题的条目,但在您的情况下,您必须小心,在延迟期内禁止操作。

  3. 考虑到(1)和(2),我可能不会分享一个特殊的用例,即项目没有得到通用缓存的安全可重复操作的支持。