持久化相關(guān)問題

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 命令查看磁盤的使用情況;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容