首先我給大家解釋下,Redis的OOM分兩種
簡短介紹下Redis內存消耗劃分情況,為下文診斷提供思路。上圖可以總結Redis消耗內存分如下幾塊:
使用redis-benchmark持續灌入數據
制造輸入緩沖區壓力(防止幹擾,先清空數據再壓測)
壓測幾秒鐘後,觸發OOM
檢查輸入緩沖區內存消耗,能看到客戶端輸入緩沖區消耗總量為 2.4G左右,遠遠超過maxmemory參數設置。
可通過運行上述檢查命令,定位到各客戶端輸入緩沖區的內存消耗(由大到小排序)。
壹般如果定位到有連接異常,可以使用如下命令殺掉
為測試方便,我直接把復制積壓緩沖區配置為800M。
開啟redis-benchmark壓測進程
檢查復制積壓緩沖區內存消耗,可以看到因為緩沖區設置過大,數據量才存儲190多M,Redis就無法寫入了。
若客戶端輸出緩沖區太大如何排查?壹般該場景比較少見,常見於用到了redis的 monitor 命令
先開啟monitor命令
上文排查過程有些Redis運維命令我認為比較實用,整理如下
腳本執行效果: