## 一、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阻塞