Fork阻塞

在Redis中,众多因素导致Redis单机内存不能过大。当面对请求暴增时,需要从库扩容,如果单机内存过大会导致扩容时间过长;当主机宕机后,切换主机需要重新挂载从库,Redis内存过大会导致挂载速度过慢。

持久化过程中的fork操作

父进程通过fork操作可以创建子进程;

子进程创建后,父子进程共享代码段,不共享进程的数据空间,但是子进程会获得父进程的数据空间副本。

在操作系统层面,基本都采用写时复制,也就是父子进程在修改数据空间之前,父子进程实际上可以共享数据空间;但是当父进程要进行数据修改的时候,操作系统会为修改的那一部分(内存的一页)制作一个副本。

虽然fork时,子进程不会复制父进程的数据空间,但是会复制内存页表(页表相当于内存的索引、目录);父进程的数据空间越大,内存页表越大,fork时复制耗时也会越多。

在Redis中,无论RDB持久化的bgsave还是AOF重写的bgrewriteaof,都需要主进程fork子进程来进行操作。如果Redis内存过大,会导致fork操作时复制内存页表耗时过多;而在Redis主进程进行fork时,是完全阻塞的,这就意味着无法响应客户端的请求,会造成请求延迟过大。为了减轻fork操作带来的阻塞问题,除了控制Redis单机内存的大小外,还可以适度放宽AOF重写出发的条件。

AOF阻塞

AOF阻塞主线程是因为随着数据量的增多,操作的频繁,AOF文件会越

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。