持久化相关问题

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 命令查看磁盘的使用情况;

你可能感兴趣的:(持久化相关问题)