最近在打计算机系统能力大赛的数据库创新设计赛道,不得不说学到了很多东西。比赛用的是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)不够用时,部分数据会被移到交换分区,从而释放物理内存给当前运行的进程。
交换分区的作用
-
防止内存溢出:当系统的 RAM 被完全使用时,操作系统会将不常用的内存页(数据或进程)临时存储到交换分区中,保证系统继续运行而不会因为内存耗尽而崩溃。
-
提升系统稳定性:在内存高负载的情况下,交换分区作为“后备”存储,可以帮助系统避免“内存不足”的错误。特别是在内存占用较高的服务器或运行多个应用程序时,交换分区能够提供额外的内存支持。
-
内存页回收:Linux 会在内存使用压力大时主动把一些不活跃的内存页交换到磁盘上,换回来时再重新加载到 RAM,这样有助于提高系统的效率,特别是对于运行较多进程的系统。
-
提高多任务处理能力:当系统需要处理大量并发任务时,交换分区可以扩展可用内存容量,从而支持更多的进程和任务。
交换分区的缺点
-
性能开销:交换分区通常存放在硬盘或固态硬盘(SSD)中,相比 RAM,其访问速度要慢得多。如果系统频繁依赖交换分区,可能会导致性能显著下降(特别是在传统硬盘上)。
-
过度依赖交换分区不推荐:虽然交换分区能延缓内存耗尽的情况,但它不能替代物理内存。系统性能的瓶颈通常是在频繁使用交换分区时,而不是物理内存不足。
何时需要使用交换分区
- 内存较小:如果你的系统内存较小(例如 4GB 或更少),配置交换分区能提高系统的稳定性,防止内存不足时程序崩溃。
- 服务器或多任务环境:对于运行多个服务或进程的服务器,交换分区能提供缓解内存压力的作用。
- 虚拟机或容器:虚拟机或容器中通常会配置交换分区,用于应对动态内存需求。
如何配置交换分区
-
创建交换文件(如果没有交换分区)
如果没有交换分区,可以创建一个交换文件来启用交换:sudo fallocate -l 1G /swapfile # 创建 1GB 大小的交换文件 sudo chmod 600 /swapfile # 设置交换文件的权限 sudo mkswap /swapfile # 格式化为交换空间 sudo swapon /swapfile # 启用交换文件
-
查看当前交换使用情况
可以通过free
或swapon
命令查看交换分区的使用情况:free -h swapon --show
-
设置永久生效
为了使交换文件在系统重启后仍然有效,需要在/etc/fstab
文件中添加如下内容:/swapfile none swap sw 0 0
总结
交换分区在物理内存紧张时提供了一种缓解措施,增强了系统的稳定性。但如果系统依赖交换分区过多,可能会影响性能。因此,建议尽量根据需要配置适当的交换分区大小,同时确保系统有足够的物理内存。
标签:sudo,启动,数据库,swapfile,交换,内存不足,内存,分区 From: https://www.cnblogs.com/liu-yc/p/18566121