2017-03-06 56 views
0

在Redis的日志,与背景的线路节省了经常出现,例如:破译Redis的日志

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

任何人都可以澄清这条线恰恰意味着什么?

回答

2

Redis的时候要保存快照,它通过自身分叉先分叉过程节省了数据集中,不会因服务请求不安等

既然你有两个过程,现在,它可能意味着使用两倍的RAM,对吧?但是,不,操作系统通过让新进程引用旧进程的内存页面来实际优化此场景。

当原始服务器的内存在fork后发生更改时(由于您发布更新命令或其他原因),会发生有趣的事情。分叉进程必须保持分叉时获得的任何内存状态,因此系统在更改共享页面之前,将页面复制到分叉进程(以便不再共享),然后更改原始进程的页面。这被称为“写入时复制”。

就您而言,这大致意味着在保存快照所需的时间内,您更改了541MB的数据。

+0

感谢这个塞尔吉奥。但有一个困惑:541MB的数据变化 - 这是否意味着数据*所占用的总空间*变化*为541MB?还是有一些其他的胖子将它膨胀到541MB(例如,数据改变本身可能是微不足道的,但是这个数据所在的内存页面总共可以达到541MB)?我很难相信我的应用程序在两分钟内生成了541MB的数据!今天我的Redis进程被OOM杀死,我试图弄清楚为什么(JICYI,相关的SO问题:http://stackoverflow.com/questions/42692776/diagnosing-unexpected-redis-server-failure) –

+0

Btw,除了这个故事之外,我也在前几天尝试禁用透明的大页面。 –

+0

@HassanBaig:是的,我的意思是541MB的RAM页面。您更改一个字节,但整个页面必须复制。 –