fork操作
fork操作
- 同步操作 ,fork 是一个同步操作
- 当执行一个 bgsave 或 bgrewriteaof 首先会执行一个 fork 操作,它只是做一个内存页的拷贝,并不是拷贝所有内存,所以速度是非常快的。
- 当 fork操作比较慢或卡在某一个点,这时它会阻塞redis主线程
- 与内存量息息相关:内存越大,消耗越长(与机器类型有关)
- info:latest_fork_usec -- 可以查看 fork 的执行时间
改善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
- 单机多实例持久化文件目录可以考虑分盘
立志如山 静心求实
浙公网安备 33010602011771号