swapoff错误Cannot allocate memory

本文解释了为什么在尝试使用SwapOff命令时会遇到失败的情况。主要是因为正在使用的交换分区(swap)大小超过了可用RAM的容量。文章进一步说明了解决此问题的方法:释放足够的RAM空间以确保能够容纳当前swap分区中所有的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I found out why swapoff fails; and its because the amount of swap file being used is bigger than what can fit in the my RAM 

In other words, when we do swapoff; all that is stored in the swap will be moved to the amount of free RAM available. 
If the free RAM available is less than the swap being used, the system cant turn off the swap because it needs to 'dump' it to the RAM 

In other words if you have 512 of ram and you only have 100mb of that ram available and your swap is using 300mb, you cant swapoff because the 300mb of the swap wount be able to fit in the free 100mb of the RAM. 

To test this i killed most applications that i wasnt using at the time and tried to lower the amount of RAM and SWAP being used at the moment. 

Once the i was able to free enough RAM i was able to swapoff it no issues. 

This problem is solved.

### Docker PostgreSQL 'Cannot allocate memory' 错误解决方案 #### 问题分析 在Docker容器中运行PostgreSQL时,如果出现 `FATAL: could not map anonymous shared memory` 的错误提示,通常是由于主机系统内存不足引起的。这种情况下,操作系统无法为PostgreSQL分配足够的共享内存区域[^1]。 --- #### 解决方案一:调整PostgreSQL配置参数 通过降低PostgreSQL的内存消耗可以有效减少对系统资源的压力。具体措施如下: 1. **修改 `shared_buffers` 参数** 将 `shared_buffers` 设置为较低值(例如总内存的25%)。可以在 `/etc/postgresql/<version>/main/postgresql.conf` 文件中找到该参数并进行更改: ```plaintext shared_buffers = 256MB ``` 2. **调整 `work_mem` 参数** 减少单次查询所允许的最大内存使用量。例如,将默认值改为更小的数值(如8MB): ```plaintext work_mem = 8MB ``` 此外需要注意的是,`work_mem` 的实际消耗取决于并发连接数和复杂查询的数量[^3]。 3. **限制最大连接数 (`max_connections`)** 如果数据库存在过多的同时连接请求,也可能引发内存耗尽的情况。适当减小 `max_connections` 可以缓解这一问题: ```plaintext max_connections = 50 ``` 4. **启用外部连接池工具** 考虑引入像 PgBouncer 这样的外部连接池软件来管理和复用客户端连接,从而进一步减轻服务器负担[^1]。 完成上述改动后需重启PostgreSQL服务才能生效: ```bash sudo systemctl restart postgresql ``` --- #### 解决方案二:清理Linux主机上的内存与swap空间 ##### 方法一:释放页面缓存、dentries 和 inodes 缓存 执行以下命令能够快速释放无用的缓存数据,进而腾出更多可用内存供其他进程调用: ```bash sync; echo 3 > /proc/sys/vm/drop_caches ``` 这里 `sync` 命令的作用是确保所有挂起的操作都已完成后再继续;而向 `/proc/sys/vm/drop_caches` 写入数字 `3` 则表示清除全部三类缓存[^2]。 ##### 方法二:重置swap分区 当swap已被过度占用时,可通过先禁用再重新启用相应设备的方式来达到目的: ```bash sudo swapoff -a && sudo swapon -a ``` 此过程会尝试将原本驻留在swap中的内容迁回到物理RAM里去,前提是后者尚有富余容量可供利用[^3]。 ##### 方法三:扩展虚拟内存大小 假如经常面临内存短缺状况,则建议扩充swap文件尺寸作为一种权宜之计。创建一个新的较大规模swapfile步骤如下所示: ```bash # 创建一个新swap文件 (此处设为2GB) sudo fallocate -l 2G /swapfile # 修改权限保护隐私 sudo chmod 600 /swapfile # 格式化成为swap类型 sudo mkswap /swapfile # 开启新的swap支持 sudo swapon /swapfile ``` 最后别忘了更新 `/etc/fstab` 记录以便下次开机自动生成相同的映射关系。 --- #### 结论 针对Docker环境中PostgreSQL启动失败的问题,既可以从优化其自身资源配置入手,也可以着眼于改善宿主机器的整体健康状态两方面着手应对。前者侧重于精细化控制各项指标上限阈值,后者则强调及时回收闲置资产以及必要时候增强基础设施能力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值