为什么redis aof将0M重写为磁盘?

时间:2013-08-01 04:00:21

标签: redis

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

 # 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,而是非常小。原因是我在测试程序中的错误。

1 个答案:

答案 0 :(得分:3)

  
    

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

  

这与AOF的最终尺寸完全无关。

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

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

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

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