本文是关于AOF在Redis的潜在堵点。我觉得边肖很实用,就和大家分享一下作为参考。让我们跟着边肖看一看。
AOF有哪些潜在的阻塞点
1. Redis采用fork子进程重写AOF文件时,有潜在的阻塞风险
1)、fork子进程
fork子进程,瞬间fork肯定会阻塞主线程(注意fork时不会将所有内存数据一次性复制到子进程),fork采用操作系统提供的写实复制(Copy On Write)机制,就是为了避免一次性拷贝大量内存数据给子进程造成的长时间阻塞问题.【相关推荐:Redis视频教程】
但是,fork子进程需要复制进程的必要数据结构,其中之一就是拷贝内存页表(虚拟内存和物理内存的映射索引表)。这个复制过程会消耗大量的CPU资源,在复制完成之前整个过程都会被阻塞。阻塞时间取决于整个实例实例越大,内存页表越大,fork阻塞时间越久.的内存大小
复制内存页表后,子进程和父进程指向同一个内存地址空间,也就是说,虽然此时生成了子进程,但并不适用与父进程相同的内存大小。
亲子过程什么时候才能真正脱离记忆?
“写实复制”顾名思义,就是在写发生时,才真正拷贝内存真正的数据,这个过程中,父进程也可能会产生阻塞的风险,就是下面介绍的场景.
从
2)、AOF重写中父进程有写入的场景
分叉的子进程指向与父进程相同的内存地址空间。此时,子进程可以执行AOF重写,并将内存中的所有数据写入AOF文件。
但是,此时,父进程仍有流量要写。如果父进程正在操作一个现有的键,那么父进程实际上将复制对应于该键的内存数据,并申请新的内存空间。于是,渐渐地,父子进程的内存数据开始分离,父子进程逐渐有了自己独立的内存空间。因为内存分配是基于页面的,默认值是4k,如果此时父进程正在操作bigkey,则重新申请大块内存需要更长时间,这可能会导致阻塞风险。
此外,如果操作系统打开内存大页机制(Huge Page,页面大小2M),父进程申请内存时阻塞的概率将大大提高,因此需要在Redis机器上关闭巨型页面机制。每次Redis fork生成RDB或AOF重写完成时,您可以看到父进程在Redis日志中重新应用了多少内存空间。
3)、AOF重写为什么不复用AOF本身日志呢
AOF在不重用AOF本身的情况下重写日志:
一个原因是父子进程写同一个文件必然会产生竞争问题,控制竞争意味着会影响父进程的性能。
第二,如果AOF的重写过程失败了,那么原来的AOF文件就相当于被污染了,无法恢复使用。因此,Redis AOF重写了一个新文件。如果重写失败,直接删除这个文件就可以了,不会影响原来的AOF文件。重写完成后,直接替换旧文件即可。
感谢阅读!这篇关于“AOF在Redis有哪些潜在的阻碍点”的文章就分享到这里。希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/157070.html