8

为什么memcached中有硬编码的块限制(压缩后 0.5 兆)?有没有人重新编译他们的?我知道我不应该发送这样的大块,但是这些额外的大块不时发生在我身上并造成严重破坏。

4

1 回答 1

4

这个问题以前在官方FAQ里

我可能会遇到的 memcached 有哪些限制?(回程机)

去引用:

您可能会在 memcache 中看到的简单限制是键和项目大小限制。密钥限制为 250 个字符。存储数据的大小不能超过 1 兆字节,因为这是最大的典型平板大小。”

常见问题解答现已修订,现在有两个单独的问题涉及此问题:

最大密钥长度是多少?(250 字节)

密钥的最大长度为 250 个字符。请注意,如果您使用客户端“前缀”或类似功能,此值会更小,因为前缀被添加到原始键的前面。较短的密钥通常更好,因为它们可以节省内存并使用更少的带宽。

为什么项目的大小限制为 1 兆字节?

啊,这是一个流行的问题!

简短的回答:因为内存分配器的算法是如何工作的。

长答案:Memcached 的内存存储引擎(将来可插入/调整......),使用平板方法进行内存管理。内存被分成不同大小的块,从最小数量开始,然后按阶乘上升到最大可能值。

假设最小值为 400 字节,最大值为 1 兆字节,阶乘为 1.20:

平板 1 - 400 字节 平板 2 - 480 字节 平板 3 - 576 字节 ... 等等。

板坯越大,它与前一块板坯之间的间隙就越大。所以最大值越大,内存存储的效率就越低。Memcached 还必须为每个存在的slab 预先分配一些内存,因此设置一个较小的阶乘和较大的最大值将需要更多的开销。

您不想这样做还有其他原因......如果我们谈论的是网页并且您试图存储/加载那么大的值,那么您可能做错了什么。在那个大小下,将数据结构加载和解压缩到内存中需要相当长的时间,并且您的站点可能不会表现得很好。

如果你确实想存储大于 1MB 的项目,你可以使用编辑过的slabs.c:POWER_BLOCK值重新编译 memcached,或者使用低效的 malloc/free 后端。其他建议包括数据库、MogileFS 等。

于 2008-08-08T17:37:02.743 回答