解決 Redis 后臺持久化失敗的問題:內存不足導致 fork 失敗

文章目錄

  • 解決 Redis 后臺持久化失敗的問題:內存不足導致 fork 失敗
  • 問題背景與成因
  • 解決方案
    • 修改內核參數 vm.overcommit_memory
    • 增加系統內存或 Swap 空間
    • 調整 Redis 配置 stop-writes-on-bgsave-error
  • 在 Docker 環境中的注意事項
  • 總結


解決 Redis 后臺持久化失敗的問題:內存不足導致 fork 失敗

在生產環境中,有時你可能會在 Redis 日志中看到類似如下的錯誤信息:

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

本文將詳細介紹該問題的原因以及如何通過調整內核和 Redis 配置來解決此問題。


問題背景與成因

Redis 作為一個內存數據庫,在執行后臺持久化(例如 BGSAVE 命令時)需要 fork 一個子進程來生成數據庫快照(RDB 文件)。在 fork 過程中,操作系統需要為子進程分配與父進程相同大小的內存空間,盡管實際使用了 copy-on-write 技術,但操作系統依然會預留相應的虛擬內存空間。

當內核參數 vm.overcommit_memory 設置為 0(默認值)時,系統會在 fork 前檢查是否有足夠的物理內存和 swap 空間可用。如果可用內存不足,即使當前看起來內存空閑量還不錯,fork 操作也可能會失敗,從而導致 RDB 快照生成失敗,Redis 會報出上述警告信息,甚至在持久化失敗后停止接受寫入,存在數據丟失風險 citeturn0search1.


解決方案

針對這個問題,我們主要有以下幾種解決辦法:

修改內核參數 vm.overcommit_memory

通過將 vm.overcommit_memory 設置為 1,可以讓 Linux 內核在執行 fork 時更樂觀地分配內存,即使當前物理內存不足也允許 fork 成功。
操作步驟如下:

  • 臨時修改(重啟后失效):

    echo 1 > /proc/sys/vm/overcommit_memory
    
  • 永久修改
    編輯 /etc/sysctl.conf 文件,添加或修改如下行:

    vm.overcommit_memory = 1
    

    保存后,運行以下命令使配置生效:

    sysctl -p
    

這種方法適用于所有運行在該主機上的 Redis 實例(注意:在 Docker 環境下,vm.overcommit_memory 是宿主機級別的設置 citeturn0search9)。

增加系統內存或 Swap 空間

如果你的服務器物理內存不足,也可以考慮增加物理內存或配置更大的 Swap 區域,從而在 fork 時能提供足夠的虛擬內存。這種方法能夠在硬件上根本上解決問題,但可能會增加系統成本。

調整 Redis 配置 stop-writes-on-bgsave-error

Redis 默認配置 stop-writes-on-bgsave-error 為 yes,也就是當后臺持久化(BGSAVE)失敗時,Redis 會拒絕處理修改命令,防止數據不一致。
如果你有完善的監控系統,可以選擇暫時將此參數設置為 no,讓 Redis 即使在持久化失敗時也繼續工作,不過這會增加數據丟失的風險。

修改方法(在 redis.conf 中配置):

stop-writes-on-bgsave-error no

提示: 此方法僅作為臨時應急方案,最好在確保內存配置正確后使用。


在 Docker 環境中的注意事項

如果你的 Redis 部署在 Docker 容器中,需要注意:

  • vm.overcommit_memory 是內核級別的參數,不能只針對單個容器進行設置,必須在宿主機上調整。
  • 對于容器化環境下的內存管理,還要做好容器資源的限制和監控,確保 Redis 在高負載下依然穩定運行。

總結

Redis 后臺持久化失敗通常是由于 fork 子進程時內存不足引起的。為了解決這一問題,推薦:

  • 修改內核參數 vm.overcommit_memory 設置為 1,以便系統允許過度分配內存;
  • 根據需求增加物理內存或 Swap 空間;
  • 如有必要,可調整 stop-writes-on-bgsave-error 參數以確保服務不中斷,但需權衡數據安全風險。

通過以上措施,可以有效降低 Redis 因內存不足導致持久化失敗的風險,保障數據的安全性和系統的穩定運行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73393.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

反射、反射調用以及修改成員變量,成員方法,構造函數、反射的應用

DAY11.2 Java核心基礎 反射(第二彈) 第一彈請訪問鏈接: 反射(第一篇) getMethod(String name, Class… parameterTypes)getMethods()getDeclaredMethod(String name,Class… parameterTypes)getDeclaredMethods() …

【鴻蒙開發】Hi3861學習筆記- 外部中斷

00. 目錄 文章目錄 00. 目錄01. 概述02. EXTI相關API03. 硬件設計04. 軟件設計05. 實驗現象06. 附錄 01. 概述 我們在做按鍵控制實驗時,雖然能實現 IO 口輸入功能,但代碼是一直在檢測 IO 輸入口的變化,因此效率不高,特別是在一些…

使用 crontab 定時同步服務器文件到本地

https://www.dong-blog.fun/post/1987 1. 安裝 sshpass sshpass 是一個可以自動輸入密碼的工具。如果未安裝,運行以下命令安裝: ? 對于 Debian/Ubuntu 系統: apt update && apt install sshpass? 對于 CentOS/RHEL 系統&#xf…

反射機制的理解

一、getName 方法解析 代碼功能 public static String getName(String key) throws IOException {Properties properties new Properties();FileInputStream in new FileInputStream("D:\\路徑...\\application.properties");properties.load(in); // 加載配置文…

Visual studio + Qt 項目配置管理

Visual studio Qt 項目配置管理 1.本機順利安裝 vs 和 Qt 軟件 ? 并且設置好Qt 的環境變量比如 E:\Qt\Qt5.9.8\5.9.8\msvc2017_64\bin E:\Qt\Qt5.9.8\5.9.8\msvc2017_64\lib E:\Qt\Qt5.9.8\5.9.8\msvc2017_64\include //這里是你電腦上Qt的路徑,每臺電腦不一樣…

通過 Python 爬蟲提高股票選股勝率

此貼為Python爬蟲技術學習貼 在股票中,即便有了選股規則,從5000多只股票中篩選出符合規則的股票也是十分困難的,于是想通過爬蟲來實現自動化的快速選股。全文用GP代替股票 實現方案 1、指定兩套規則,第一套弱約束,第…

SpringCloud帶你走進微服務的世界

認識微服務 隨著互聯網行業的發展,對服務的要求也越來越高,服務架構也從單體架構逐漸演變為現在流行的微服務架構。這些架構之間有怎樣的差別呢? 單體架構 單體架構:將業務的所有功能集中在一個項目中開發,打成一個…

FastAPI復雜查詢終極指南:告別if-else的現代化過濾架構

title: FastAPI復雜查詢終極指南:告別if-else的現代化過濾架構 date: 2025/3/14 updated: 2025/3/14 author: cmdragon excerpt: 本文系統講解FastAPI中復雜查詢條件的構建方法,涵蓋參數驗證、動態過濾、安全防護等18個核心技術點。通過引入策略模式、聲明式編程等技術,徹…

Ubuntu 22.04使用pigz多線程快速解壓/壓縮文件

最近搞項目,資料太大,解壓時間太久,于是想辦法解決。 開貼記錄。 1.安裝pigz sudo apt install pigz 2.解壓資料 解壓命令為 tar --use-compress-programpigz -xvpf ***.tar.gz 將最后的部分***.tar.gz換成你自己的文件即可 例如 ti…

Amazon Quantum Ledger Database (QLDB):革新數據可信記錄的終極解決方案

在數字化浪潮中,企業數據的安全性與可信性成為核心挑戰。無論是金融交易的透明審計、供應鏈的全程追蹤,還是醫療記錄的真實性驗證,如何確保數據不可篡改且可追溯,已成為企業亟待解決的難題。Amazon Quantum Ledger Database (QLDB…

日本IT|AWS工作內容及未來性、以及轉職的所需資質和技能

AWSとは AWSはAmazon Web Services(アマゾンウェブサービス)の略稱です。 名稱から分かるとおり、ネットを通じた通販などを事業として行っているAmazon.com社がクラウドサービスとして運営しています。 本來であれば自分たちでインフラ環境を構築する…

Conda+jupyterlab

文章目錄 1、Conda1.1、基本介紹1.2、conda安裝1.3、conda常用命令1.3.1、基本命令1.3.2、環境管理 2、Jupyterlab2.1、基本介紹2.2、安裝使用 3、pycharm中使用conda 1、Conda 1.1、基本介紹 Conda 是一個開源的包管理和環境管理工具,適用于 Python 及其他編程語…

Vue 項目中 CDN 引入的利弊及解決方案

在Vue項目中,引入到工程中的所有js、css文件,編譯時都會被打包進vendor.js,瀏覽器在加載該文件之后才能開始顯示首屏。若是引入的庫眾多,那么vendor.js文件體積將會相當的大,影響首屏的體驗。通過調試發送時間主要消耗…

擁有一臺云服務器能做什么呢?

擁有一臺云服務器就像擁有了一臺24小時在線的遠程電腦,你可以通過互聯網隨時隨地管理它。它的用途非常廣泛,無論是個人學習、開發測試,還是企業級應用部署,都能發揮重要作用。以下是常見的應用場景,按需求分類整理&…

PHP 在 if 判斷時由于運算符優先級導致 false 的問題

首先來看一段代碼&#xff1a; $price 187.50;if (!is_numeric($price) || $price < 0 || ($price * 100 > 1000000)) {echo "價格錯誤&#xff1a;$price\n"; } else {echo "價格正確&#xff1a;$price\n"; }乍一看是不是認為并沒有什么問題&…

從零基礎到能獨立設計單片機產品,一般需要經歷哪些學習階段?

相信很多人&#xff0c;內心都有“鋼鐵俠”的幻想&#xff0c;成為能寫程序&#xff0c;能設計硬件&#xff0c;能設計結構&#xff0c;能焊接的全能型人才。 上次徐工問我&#xff0c;如果你財富自由了&#xff0c;想去做啥&#xff1f; 我說出來&#xff0c;可能大家都不信&a…

Liunx啟動kafka并解決kafka時不時掛掉的問題

kafka啟動步驟 先啟動zookeeper&#xff0c;啟動命令如下 nohup ./zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties > /home/kafka/kafka/zookeeper.log 2>&1 &再啟動kafka&#xff0c;啟動命令如下 nohup ./kafka-server-start.sh…

使用STM32CubeMX配置定時器中斷實現LED每秒閃爍一次(STM32G070CBT6)

說明&#xff1a; 本案例采用的定時器3&#xff08;TIM3&#xff09;實現&#xff0c;使用其他定時器是一樣配置。 如何新建一個工程以及如何配置LED的端口&#xff0c;請查看前面文章&#xff1a;使用STM32CubeMX實現LED燈每秒閃爍一次&#xff08;STM32G070CBT6單片機&…

暴力破解Excel受保護的單元格密碼

暴力破解Excel受保護的單元格密碼 分享一個暴力破解Excel受保護的單元格密碼的方法 第一步 在Excel中按下Alt F11&#xff0c;打開Visual Basic for Applications&#xff08;VBA&#xff09;編輯器。 第二步 在VBA編輯器中&#xff0c;點擊插入菜單&#xff0c;選擇模塊…

Git常用操作之GitLab

Git常用操作之GitLab 小薛博客官網&#xff1a;小薛博客Git常用操作之GitLab官方地址 1、GitLab安裝 https://gitlab.cn/install/ 1、Docker安裝GitLab https://docs.gitlab.cn/jh/install/docker.html 1、設置卷位置 在設置其他所有內容之前&#xff0c;請配置一個新的…