fork操作 fork操作是一個同步操作,若執行較慢會阻塞redis主線程 執行時間與記憶體量相關:記憶體越大,耗時越長;虛擬機較慢,真機較快。 查看fork執行時間,可做監控 info : latest_fork_usec 上一次執行fork的微秒數 優先使用物理機或者高效支持fork操作的虛擬化技術 ...
-
fork操作是一個同步操作,若執行較慢會阻塞redis主線程
-
執行時間與記憶體量相關:記憶體越大,耗時越長;虛擬機較慢,真機較快。
-
查看fork執行時間,可做監控
-
info : latest_fork_usec 上一次執行fork的微秒數
-
-
優先使用物理機或者高效支持fork操作的虛擬化技術
-
控制Redis實際最大可用記憶體
-
合理配置Linux記憶體分配策略 vm.overcommit_memory = 1
-
預設這個值為0,在記憶體比較低的時候,會發生fork阻塞
-
-
降低fork頻率:例如放寬AOF重寫自動觸發時機,不必要的全量複製
進程外開銷
-
CPU開銷
-
RDB和AOF都會生成文件,屬於CPU密集型
-
優化1:不做CPU綁定,不和CPU密集型的應用部署在同一臺伺服器上
-
優化2:避免在單機多部署的場景大量發生AOF重寫
-
-
記憶體
-
開銷:fork記憶體開銷,copy-on-write,子進程會共用父進程的物理記憶體頁,當父進程執行寫請求的時候會創建一個副本,此時會消耗記憶體。即父進程在大量寫入的時候,子進程開銷會比較大,創建副本。
-
優化1:防止單機多部署的時候發生大量的重寫
-
優化2:echo never > /sys/kernel/mm/transparent_hugepage/enabled
-
Linux內核的2.6.38版本中增加以上配置,支持大的記憶體頁的分配
-
記憶體頁分配越大,會提高創建副本頁的大小,影響性能
-
-
-
硬碟
-
開銷:RDB與AOF文件寫入的場景,可以集合iostat、iotop進行分析
-
優化1:不要和高硬碟負載服務部署在一起,例如存儲服務、消息隊列
-
配置:no-appendfsync-on-rewrite = yes
-
根據寫入量決定磁碟類型:SSD
-
單機多實例持久化目錄可以考慮分盤以及做資源限制,例如cgroup
-
AOF追加阻塞
Redis在執行fsync的時候,redis為了保證AOF文件安全性,會校驗上次fsync的時間是否大於2秒。若超過2秒,會發生阻塞。
可以通過Redis日誌進行定位:Asynchronous AOF fsync is taking too long (disk is busy?)
也可以通過info persistence命令進行查看:每發生一次,aof_delayed_fsync 會增1
優化方法可以參考硬碟優化策略