Redis中AOF有哪些潜在的阻塞点

59次阅读
没有评论

共计 1229 个字符,预计需要花费 4 分钟才能阅读完成。

这篇文章给大家分享的是有关 Redis 中 AOF 有哪些潜在的阻塞点的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。

AOF 有哪些潜在的阻塞点

1. Redis 采用 fork 子进程重写 AOF 文件时,有潜在的阻塞风险

1)、fork 子进程

fork 子进程,fork 这个瞬间一定是会阻塞主线程的(注意,fork 时并不会一次性拷贝所有内存数据给子进程),fork 采用操作系统提供的写实复制 (Copy On Write) 机制,就是为了避免一次性拷贝大量内存数据给子进程造成的长时间阻塞问题。【相关推荐:Redis 视频教程】

但 fork 子进程需要拷贝进程必要的数据结构,其中有一项就是拷贝内存页表(虚拟内存和物理内存的映射索引表),这个拷贝过程会消耗大量 CPU 资源,拷贝完成之前整个进程是会阻塞的,阻塞时间取决于整个实例的内存大小,实例越大,内存页表越大,fork 阻塞时间越久。

拷贝内存页表完成后,子进程与父进程指向相同的内存地址空间,也就是说此时虽然产生了子进程,但是并没有申请与父进程相同的内存大小。

那什么时候父子进程才会真正内存分离呢?

“写实复制”顾名思义,就是在写发生时,才真正拷贝内存真正的数据,这个过程中,父进程也可能会产生阻塞的风险,就是下面介绍的场景。

2)、AOF 重写中父进程有写入的场景

fork 出的子进程指向与父进程相同的内存地址空间,此时子进程就可以执行 AOF 重写,把内存中的所有数据写入到 AOF 文件中。

但是此时父进程依旧是会有流量写入的,如果父进程操作的是一个已经存在的 key,那么这个时候父进程就会真正拷贝这个 key 对应的内存数据,申请新的内存空间,这样逐渐地,父子进程内存数据开始分离,父子进程逐渐拥有各自独立的内存空间。因为内存分配是以页为单位进行分配的,默认 4k,如果父进程此时操作的是一个 bigkey,重新申请大块内存耗时会变长,可能会产生阻塞风险。

另外,如果操作系统开启了内存大页机制(Huge Page,页面大小 2M),那么父进程申请内存时阻塞的概率将会大大提高,所以在 Redis 机器上需要关闭 Huge Page 机制。Redis 每次 fork 生成 RDB 或 AOF 重写完成后,都可以在 Redis log 中看到父进程重新申请了多大的内存空间。

3)、AOF 重写为什么不复用 AOF 本身日志呢

AOF 重写不复用 AOF 本身的日志:

一个原因是父子进程写同一个文件必然会产生竞争问题,控制竞争就意味着会影响父进程的性能。

二是如果 AOF 重写过程中失败了,那么原本的 AOF 文件相当于被污染了,无法做恢复使用。所以 Redis AOF 重写一个新文件,重写失败的话,直接删除这个文件就好了,不会对原先的 AOF 文件产生影响。等重写完成之后,直接替换旧文件即可。

感谢各位的阅读!关于“Redis 中 AOF 有哪些潜在的阻塞点”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-15发表,共计1229字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)