1

我正在使用带有 aof 的 Redis 2.6.14。重写后aof文件的大小变为0M,我无法理解。给我一些帮助,请。以下是日志:

 # Server started, Redis version 2.6.14
 * The server is now ready to accept connections on port 7379
 * Starting automatic rewriting of AOF on 2098226700% growth
 * Background append only file rewriting started by pid 7961
 * SYNC append only file rewrite performed
 * AOF rewrite: 0 MB of memory used by copy-on-write
 * Background AOF rewrite terminated with success
 * Parent diff successfully flushed to the rewritten AOF     (94778 bytes)
 * Background AOF rewrite finished successfully

我认为“AOF 重写:写时复制使用的 0 MB 内存”是关键,谁来解释一下?


我以这种方式得到了答案:

1.edit the redis.conf, set the loglevel to debug.
2.I found that the keys is only 32, so it is the problem of my test program.
3.I modified the test program, make keys unique. When the program runs again, the keys in reids increase rapidly, and the aof file increase too.
4.when the rewrite is triggered, write 2M bytes into aof file instead of 0M.

结论是:重写为aof的字节大小并不是真的为0,而是很小。原因是我在测试程序中的错误。

4

1 回答 1

3

我认为“AOF 重写:写时复制使用的 0 MB 内存”是关键,谁来解释一下?

它与 AOF 的最终大小完全无关。

Redis 是一个单线程事件循环。当它必须处理长时间运行的作业时,例如 RDB 转储或 AOF 重写,它会派生第二个进程来完成它。该作业将与未阻塞的 Redis 事件循环并行运行。这种机制利用了操作系统的虚拟内存子系统提供的写时复制功能。

当 Redis 分叉时,内存页面将由两个进程共享。但是在作业运行的同时,Redis 仍然可以修改这些内存页面(插入、更新、删除操作)。这些操作会被操作系统捕获,并且页面会在惰性模式下被复制,只有当它们被修改时。

结果是 Redis 在运行后台作业时可能会消耗更多或更少的内存。如果发生大量写入操作,则写入时复制机制将消耗更多内存。

“AOF 重写:写时复制使用的 xxx MB 内存”行仅提供了写时复制内存开销的评估。理想情况下,它应该是 0(意味着没有页面被复制)。如果在后台运行时开始大量写入,就会增加。在最坏的情况下(不太可能),它可能接近 Redis 使用的总内存。

于 2013-08-02T15:42:20.560 回答