2

After browsing some of the code of Redis, I notice that the "robj" creation is done by calling "createObject" function, which in turn calls "malloc" to alloc memory. So whenever a request comes(e.g. SET uid 1234), there will be a memory allocation process.

My question is, why not pre-allocate the space to reduce memory allocation cost? because of different object size?

4

1 回答 1

7

我的问题是,为什么不预先分配空间以降低内存分配成本?因为不同的物体大小?

您描述的是内存分配器的工作。在 Redis 中构建这种逻辑并非易事。

默认情况下,Redis 在 Linux 上使用jemalloc内存分配器。

Jemalloc 有几个优化来减少内存分配开销。阅读以下链接以了解 jemalloc 如何提供帮助 -

  1. Jemalloc 上的 Facebook 工程博客
  2. 2006 年的 Jemalloc 纸

当 Redis 引入 Jemalloc 时,很多内存管理问题就消失了。这是antirez(redis 的作者)对引入 jemalloc 的看法:

[snip] 分配器是一件严肃的事情。由于我们引入了特殊编码的数据类型,Redis 开始遭受碎片化的困扰。我们尝试了不同的方法来解决这个问题,但基本上 glibc 中的 Linux 默认分配器真的很糟糕。

在 Redis 中包含 jemalloc 是一个巨大的胜利。此更改修复了现实世界系统中的每个碎片案例,并且使用的内存量也有所下降。

PS 您可能会在 redis-db 邮件列表中获得更好、更明智的答案

于 2012-10-12T05:56:23.257 回答