在redis日志中,经常会出现与后台保存相关的行,例如:

[11465] 06 Mar 08:10:11.292 * RDB: 541 MB of memory used by copy-on-write

有谁能澄清这句话的确切含义吗?

最佳答案

当redis想要保存一个快照时,它首先将自己分叉,然后分叉的进程保存数据集,而不受服务请求等的干扰。
既然你现在有两个进程,那就意味着要用两倍的内存,对吧?但不是,操作系统实际上通过让新进程引用旧进程的内存页来优化这个场景。
当原始服务器的内存在fork之后发生变化时(由于您发出更新命令或其他原因),会发生有趣的事情。分叉进程必须保持分叉时获得的任何内存状态,因此系统在更改共享页之前,将该页复制到分叉进程(使其不再共享),然后更改原始进程的页。这被称为“书面复制”。
在您的例子中,这大致意味着在保存快照所需的时间内,您更改了541MB的数据。

09-25 18:42