Redis后台的保存模式依赖于现代操作系统中fork调用的copy-on-write语义:Redis forks(创建子进程)是父进程的精确副本。子进程将DB转储到磁盘上,然后退出。理论上,子进程应该使用与父进程一样多的内存,但实际上,由于大多数现代操作系统实现了copy-on-write语义,父进程和子进程将共享公共内存页。只有当一个页面在子进程或父进程中发生变化时,它才会被复制。由于理论上所有的页面都可能在子进程保存时发生变化,Linux无法提前知道子进程将占用多少内存,所以如果将overcommit_memory设置为0,分叉将会失败,除非你有足够可用的RAM来真正复制所有父内存页面。也就是说,如果您有一个3 GB的Redis数据集,而只有2 GB的可用内存,那么将会导致分叉失败。
将overmit\u memory设置为1会让Linux以更乐观的分配方式执行fork,这也确实才是您想要的Redis。
要了解Linux虚拟内存的工作原理以及overcommit_memory和overcommit_ratio的其他替代方案,您可以参考Red Hat Magazine的经典文章《理解虚拟内存》。您也可以参考手册页,了解可用值的解释。