## 一、fork
### 1.fork操作
* 同步操作 ,fork 是一个同步操作
* 当执行一个 bgsave 或 bgrewriteaof 首先会执行一个 fork 操作,它只是做一个内存页的拷贝,并不是拷贝所有内存,所以他的速度是非常快的。
* 当 fork操作比较慢或卡在某一个点,这时它会阻塞redis主线程
* 与内存量息息相关:内存越大,消耗越长(与机器类型有关)
* info:latest_fork_usec -- 可以查看 fork 的执行时间
### 2.改善fork
* 优先使用物理机或者高效支持fork操作的虚拟化技术
* 控制Redis 实例最大可用内存:maxmemory
* 合理配置Linux内存分配策略:vm.overcommit_memory = 1
* 默认是0,当发现没有足够内存做内存分配时,就会不去分配。对于fork讲,会造成fork阻塞。
* 降低fork频率:例如放宽AOF重写自动触发机制,不必要的全量复制
## 二、子进程开销和优化
### 1.CPU
* 开销:RDB和AOF文件生成,属于CPU密集型
* 优化:不做CPU绑定,不和CPU密集型部署
### 2.内存
* 开销:fork内存开销,copy-on-write
* 优化:echo never > /sys/kernel/mm/transparent_hugepage/enabled
### 3.硬盘
* 开销:AOF和RDB文件写入,可以结合iostat,iotop分析
* 优化
* 不要和高硬盘负载服务器部署在一起:存储服务、消息队列等
* no-appendfsync-on-rewrite = yes
* 根据写入量决定磁盘类型:例如SSD
* 单机多实例持久化文件目录可以考虑分盘
## 三、AOF阻塞