前言:
在之前的文章中介绍过Redis的持久化策略,和Redis的底层模型。这篇文章主要介绍Redis中存在的两大阻塞情况,Fork阻塞和AOF追加阻塞。
1. fork阻塞:CPU的阻塞
在Redis中,众多因素导致Redis单机内存不能过大。
- 当面对请求暴增时,需要从库扩容,如果单机内存过大会导致扩容时间过长;
- 当主机宕机后,切换主机需要重新挂载从库,Redis内存过大会导致挂载速度过慢;
- 持久化过程中的fork操作
fork操作:
父进程通过fork操作可以创建子进程;子进程创建后,父子进程共享代码段,不共享进程的数据空间。但是子进程会获得父进程的数据空间副本。在操作系统层面,基本都采用写时复制,也就是父子进程视图修改数据空间之前,父子进程实际上可以共享数据空间;但是当父子进程中任何一个视图修改数据空间时,操作系统会为修改的那一部分(内存的一页)制作一个副本。
虽然fork时,子进程不会复制父进程的数据空间,但是会复制内存页表(页表相当于内存的索引、目录);父进程的数据空间越大,内存页表越大,fork时复制耗时也会越多。