redis fork时无法分配内存

博客详细描述了在执行Redis的fork操作时遇到的内存无法分配的问题,分析了其根本原因,并提出了解决此类问题的有效方案。
状况:
redis日志中一直打印无法分配内存的信息
 Can't save in background: fork: Cannot allocate memory
原因:
redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的
解决方案:
将内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)
# echo 1 > /proc/sys/vm/overcommit_memory
### Redis Fork 子进程工作机制 在 Redis 中,`fork()` 函数用于创建一个新的子进程。这个新进程几乎完全复制了父进程的状态,但在某些方面有所不同,比如拥有独立的 PID 和资源分配。Redis 使用 `fork()` 主要是为了实现持久化机制中的 RDB 快照和 AOF 重写。 #### 工作流程 当调用 `fork()` 创建子进程: - **父子进程共享内存页**:通过操作系统提供的 COW (Copy-On-Write) 技术,在实际修改之前,父子进程之间会共享相同的物理页面;只有当某一方尝试更改这些页面的内容才会触发真正的拷贝动作[^3]。 - **子进程负责执行特定任务**:例如生成 RDB 文件或将当前命令追加到新的 AOF 文件中。在此期间,父进程继续处理客户端请求而不受影响。 ```bash # 示例展示如何查看 Redis 进程及其子进程 ps aux | grep redis-server ``` #### 应用场景 1. **RDB 持久化** 当配置了定期保存策略或收到手动指令 (`SAVE`, `BGSAVE`) 后,Redis 将启动一个后台线程来创建数据库快照并将其存储为 .rdb 文件。此过程中涉及大量读取操作以及最终的一次性大容量写入,因此非常适合利用 fork 来隔离 I/O 密集型工作负载,从而不影响在线服务性能。 2. **AOF 日志重写** 随着间推移,Append Only File 可能变得臃肿不堪。为了优化空间利用率并减少恢复所需的间开销,可以通过 BGREWRITEAOF 命令让 Redis 自动整理日志条目。同样地,这项任务也是交给临派生出来的子进程去完成的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值