fork操作引發(fā)的問題
- fork 操作是同步操作,如果 fork 操作過慢,就會阻塞 redis 主線程;
- fork 操作的時間和內(nèi)存有關(guān),內(nèi)存越大,fork 操作的時間越長;
- 查看 fork 操作的時間:
info:latest_fork_usec;
改善 fork 的方法
- 優(yōu)先使用物理機;
- 控制 redis 實例最大可用內(nèi)存,
maxmemory; - 合理配置 Linux 內(nèi)存分配策略:
vm.overcommit_memory=1,如果設(shè)置為0,那么當(dāng) Linux 的內(nèi)存不夠時,將拒絕分配內(nèi)存; - 降低 fork 頻率:放寬 AOF 重寫自動觸發(fā)機制,減少不必要的全量復(fù)制;
子進程開銷和優(yōu)化
- CPU
- 開銷:文件寫入是 CPU 密集型操作;
- 優(yōu)化:不要將 redis 進程綁定到某個 CPU 上,不和 CPU 密集型部署;
- 內(nèi)存
- 開銷:fork 子進程的時候?qū)?nèi)存是有開銷的,理論上和父進程內(nèi)存一樣,但 Linux 的 Copy-on-Write 會使父子進程共用相同的物理內(nèi)存件;
- 優(yōu)化:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
- 硬盤
- 開銷:AOF 和 RDB 文件寫入,可以結(jié)合 iostat 和 iotop 分析;
- 優(yōu)化:
- 不要和高硬盤負載服務(wù)部署在一起,比如存儲服務(wù),消息隊列服務(wù);
no-appendfsync-on-rewrite yes- 根據(jù)寫入量決定磁盤類型,比如 SSD;
AOF 追加阻塞
- 主線程向 AOF 緩沖區(qū)中寫數(shù)據(jù);
- 同步線程每隔一秒將 AOF 緩沖區(qū)刷入磁盤;
- 主線程會檢查上次刷入的時間:
- 如果小于 2s,正常;
- 如果大于 2s,阻塞,直到這次刷入磁盤的操作完成;
AOF 阻塞問題的定位
- redis 日志;
-
info persistence中的aof_delayed_fsync:100是記錄刷盤次數(shù)的,可以單獨收集這個值,然后計算分析一段時間的刷盤次數(shù); - 通過 Linux 的
top命令查看磁盤的使用情況;