【数据库】无法启动数据库:内存不足

最近在打计算机系统能力大赛的数据库创新设计赛道,不得不说学到了很多东西。比赛用的是PolarDB(套皮PG),最近上华为云用的是OpenGuass(也是套皮PG)(PG简直是开源之神
在实践中,由于服务器资源有限,经常遇到的一个问题是:FATAL: could not create shared memory segment: Cannot allocate memory。下面记录两种解决方案

1.手动修改配置文件

这种方案主要针对在数据库调参之后,使用pg_ctl重启数据库时遇到的内存分配问题。在PolarDB中,postgres.auto.conf文件记录了数据库每次启动时的部分参数标准(主要针对于在psql)调过的参数。笔者常用VsCode进行开发,在VsCode中使用ctrl+p搜索该文件名即可找到该文件,对其中的shared_buffers参数进行修改即可。一般设为2GB即可正常启动

2.手动启用额外的交换分区

在服务器资源很有限(比如我的华为云ECS,只有4GB内存),即使清理内存后也无法在物理上满足数据库的启动要求怎么办?
此时可以尝试手动启用额外的交换分区

sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

设置后,可以成功启动数据库。关于原理,此处贴上来自GPT的介绍(OS学的依托的结果)。

交换分区(Swap Partition)是 Linux 系统中用于管理物理内存不足时的一种机制。它相当于硬盘的一块空间,当系统的物理内存(RAM)不够用时,部分数据会被移到交换分区,从而释放物理内存给当前运行的进程。

交换分区的作用

  1. 防止内存溢出:当系统的 RAM 被完全使用时,操作系统会将不常用的内存页(数据或进程)临时存储到交换分区中,保证系统继续运行而不会因为内存耗尽而崩溃。

  2. 提升系统稳定性:在内存高负载的情况下,交换分区作为“后备”存储,可以帮助系统避免“内存不足”的错误。特别是在内存占用较高的服务器或运行多个应用程序时,交换分区能够提供额外的内存支持。

  3. 内存页回收:Linux 会在内存使用压力大时主动把一些不活跃的内存页交换到磁盘上,换回来时再重新加载到 RAM,这样有助于提高系统的效率,特别是对于运行较多进程的系统。

  4. 提高多任务处理能力:当系统需要处理大量并发任务时,交换分区可以扩展可用内存容量,从而支持更多的进程和任务。


交换分区的缺点

  1. 性能开销:交换分区通常存放在硬盘或固态硬盘(SSD)中,相比 RAM,其访问速度要慢得多。如果系统频繁依赖交换分区,可能会导致性能显著下降(特别是在传统硬盘上)。

  2. 过度依赖交换分区不推荐:虽然交换分区能延缓内存耗尽的情况,但它不能替代物理内存。系统性能的瓶颈通常是在频繁使用交换分区时,而不是物理内存不足。


何时需要使用交换分区

  • 内存较小:如果你的系统内存较小(例如 4GB 或更少),配置交换分区能提高系统的稳定性,防止内存不足时程序崩溃。
  • 服务器或多任务环境:对于运行多个服务或进程的服务器,交换分区能提供缓解内存压力的作用。
  • 虚拟机或容器:虚拟机或容器中通常会配置交换分区,用于应对动态内存需求。

如何配置交换分区

  1. 创建交换文件(如果没有交换分区)
    如果没有交换分区,可以创建一个交换文件来启用交换:

    sudo fallocate -l 1G /swapfile  # 创建 1GB 大小的交换文件
    sudo chmod 600 /swapfile        # 设置交换文件的权限
    sudo mkswap /swapfile           # 格式化为交换空间
    sudo swapon /swapfile           # 启用交换文件
    
  2. 查看当前交换使用情况
    可以通过 freeswapon 命令查看交换分区的使用情况:

    free -h
    swapon --show
    
  3. 设置永久生效
    为了使交换文件在系统重启后仍然有效,需要在 /etc/fstab 文件中添加如下内容:

    /swapfile none swap sw 0 0
    

总结

交换分区在物理内存紧张时提供了一种缓解措施,增强了系统的稳定性。但如果系统依赖交换分区过多,可能会影响性能。因此,建议尽量根据需要配置适当的交换分区大小,同时确保系统有足够的物理内存。

posted @ 2024-11-24 18:08  yichen111  阅读(199)  评论(0)    收藏  举报