fork操作引发的问题
- fork 操作是同步操作,如果 fork 操作过慢,就会阻塞 redis 主线程;
- fork 操作的时间和内存有关,内存越大,fork 操作的时间越长;
- 查看 fork 操作的时间:
info:latest_fork_usec
;
改善 fork 的方法
- 优先使用物理机;
- 控制 redis 实例最大可用内存,
maxmemory
; - 合理配置 Linux 内存分配策略:
vm.overcommit_memory=1
,如果设置为0,那么当 Linux 的内存不够时,将拒绝分配内存; - 降低 fork 频率:放宽 AOF 重写自动触发机制,减少不必要的全量复制;
子进程开销和优化
- CPU
- 开销:文件写入是 CPU 密集型操作;
- 优化:不要将 redis 进程绑定到某个 CPU 上,不和 CPU 密集型部署;
- 内存
- 开销:fork 子进程的时候对内存是有开销的,理论上和父进程内存一样,但 Linux 的 Copy-on-Write 会使父子进程共用相同的物理内存件;
- 优化:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
- 硬盘
- 开销:AOF 和 RDB 文件写入,可以结合 iostat 和 iotop 分析;
- 优化:
- 不要和高硬盘负载服务部署在一起,比如存储服务,消息队列服务;
no-appendfsync-on-rewrite yes
- 根据写入量决定磁盘类型,比如 SSD;
AOF 追加阻塞
- 主线程向 AOF 缓冲区中写数据;
- 同步线程每隔一秒将 AOF 缓冲区刷入磁盘;
- 主线程会检查上次刷入的时间:
- 如果小于 2s,正常;
- 如果大于 2s,阻塞,直到这次刷入磁盘的操作完成;
AOF 阻塞问题的定位
- redis 日志;
-
info persistence
中的aof_delayed_fsync:100
是记录刷盘次数的,可以单独收集这个值,然后计算分析一段时间的刷盘次数; - 通过 Linux 的
top
命令查看磁盘的使用情况;