我相信你不能强制正在运行的Memcached实例去除内存,不能终止那个Memcached实例(并释放它所拥有的所有内存)。有没有人知道一份明确的文件,甚至是来自可靠来源的邮件列表或博客文章,可以证实或否认这种印象?
据我了解,Memcached进程最初分配一块内存(确切的初始分配大小是可配置的),然后在其生命周期内单调增加其内存利用率,受守护进程的最大内存分配大小限制(也可配置) 。在任何情况下,Memcached守护程序都不会释放任何内存,无论守护程序是否持续需要它所拥有的内存。
我知道这个问题可能听起来有些发牢骚,“我要求开源项目X支持我的特殊需求!”根本就不是这个 - 我纯粹对这里的确切技术答案感兴趣,并且我发誓我不会对Memcached感到厌烦。对于好奇的人来说,这个问题来自讨论在单个服务器上优雅地处理多个Memcached实例的可能方法,给定一个缓存刷新成本非常高的应用程序。
但是,如果您为不同的问题保存应用程序建议/建议(重新设计我的应用程序,使用不同的缓存实现等),我将不胜感激。我很欣赏一个好的头脑风暴,但我认为如果它专注于Memcached如何工作和不工作的技术细节,那么这个问题将是最有价值的。如果你没有这个具体问题的答案,那么你所说的话可能仍然有价值,但我猜想有更好的地方可以发布更具推测性的意见/建议/意见。
答案 0 :(得分:0)
我很确定memcached无法做到这一点。我没有看到为什么它无法实现的任何技术原因。锁定缓存操作,使足够的密钥到达所需的大小,更新大小,解锁。 (我确信有更好的方法可以避免在此期间阻止服务器。)
答案 1 :(得分:0)
memory management中memcached的标准和默认机制是slab allocator。这意味着正在为进程分配内存,而不会释放到操作系统。基本上,当内存不再用于存储某些数据时,它会被进程保留,以便以后在需要时重用。但是,操作系统在完成时释放由进程分配的内存。这就是你杀死/停止memcached时释放内存的原因。
memcached中有compile-time选项可启用malloc/free机制。因此,当调用free()时,内存可能会释放到操作系统(这取决于C标准库实现)。但这样做可能会伤害好fragmentation和performance。
请在此处详细了解此问题:
答案 2 :(得分:0)
这可能是我们目前为memcached解决的最难的问题(好吧,无论如何,它的变体)。
释放一大块内存要求我们知道a)块中没有任何内容正在使用中; b)当我们正在清除它以供重用/释放时,什么都不会开始使用它。我听说过一些非常好的想法,我们可以解决我们的平板重新平衡问题基本上是一样的,除了我们不是试图释放内存,而是将其交给其他东西(一些大型装置中的常见问题) )。
此外,free是否实际上减少了进程的RSS依赖于实现。在许多情况下,malloc / fill / free会将内存映射到(除非您的分配器使用mmap
而不是sbrk
)。