【PostgreSQL】postgresql触发OOM解析

news/2024/7/27 8:22:04/文章来源:https://blog.csdn.net/hdhdhdk/article/details/137102300

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

示例: 在一台运行着PostgreSQL数据库的Linux服务器上,如果数据库工作负载非常高,例如在短时间内执行了大量的复杂查询,或者一次性加载了很大的数据集进行处理,可能会导致数据库进程占用大量的内存。例如:

1. 大规模排序操作或哈希聚合操作,这些操作会消耗 work_mem 参数指定的内存。

2. 大量的临时表操作,这会占用 temp_buffers 参数所设定的内存区域。

3. 如果进行了大规模的数据导入或索引重建,可能消耗 maintenance_work_mem 参数设定的内存。

4. 缓冲池(buffer cache)过大,如果所有活跃的数据都尝试放入内存,可能导致整个系统内存耗尽。

当PostgreSQL进程消耗的内存超过了操作系统可分配的总量,操作系统内核的OOM Killer可能会介入,为了保护系统的稳定性,选择结束掉消耗内存最多的进程,而这很可能就是PostgreSQL数据库服务进程,从而导致数据库服务宕机。

日志示例:

在PostgreSQL的日志中,不会直接记录OOM Killer的信息,但可能会看到类似下面这样的错误提示,间接表明是因为内存不足引发的问题:

LOG: could not fork new process for connection: Cannot allocate memory

数据库调整方案:

1. 参数优化:

• work_mem:根据实际业务需求调整每个查询可以使用的内存大小,避免单个查询消耗过多内存。

• temp_buffers:设置合适的临时缓冲区数量,防止临时表操作消耗过多内存。

• maintenance_work_mem:为大型维护操作(如VACUUM FULL、CREATE INDEX CONCURRENTLY等)分配充足的内存,但不至于过大。

• shared_buffers:这是PostgreSQL用于共享内存缓冲池的大小,应根据服务器总内存和并发连接数适量调整,但不要占用全部内存。

2. 监控与报警:

• 使用系统监控工具(如Prometheus、Grafana配合PostgreSQL exporter)实时监控数据库内存使用情况。

• 设置阈值报警,当内存接近满载时提前预警,以便及时手动干预或自动调度清理或优化操作。

3. 查询优化:

• 分析慢查询日志,找出消耗内存多的查询语句,通过重构查询、添加索引等方式优化查询效率和内存使用。

• 避免一次性加载大表或执行可能导致内存爆炸的复杂运算。

4. 资源管理:

• 在容器化部署环境中,给PostgreSQL容器分配适当的内存限制,并留有足够的余量给操作系统和其他服务。

• 在物理服务器上,确保操作系统本身有足够的内存,同时为PostgreSQL分配合理的内存上限。

5. 定期维护与清理:

• 定期进行 vacuum 和 analyze 操作,尤其是对于频繁更新的大表,可以有效释放内存和磁盘空间。

• 清理不再需要的索引和无用的大数据集。

6. 硬件扩容:

• 如必要,增加服务器的RAM,以适应更高的内存需求。

总结来说,解决PostgreSQL触发的操作系统OOM问题需要综合考虑系统配置、数据库参数优化、查询性能优化和系统资源的有效管理等多个方面,同时也需要良好的监控机制来预防潜在的风险

操作系统层面的调整方案:

1. 监控与告警:

• 安装系统监控工具,例如Nagios、Zabbix等,设置针对系统内存使用情况的告警阈值,当系统内存即将耗尽时,能够及时发送通知,提醒管理员进行干预。

2. 调整内存分配策略:

• 调整Linux内核的虚拟内存过载提交策略,通过修改 /proc/sys/vm/overcommit_memory 文件内容:

  •   将其设置为0表示保守的过载提交策略,系统会尝试预测是否有足够的内存满足新的内存分配请求。
  • 设置为1表示总是答应内存分配请求,但在内存耗尽时,可能会触发OOM Killer。
  • 设置为2表示根据当前可用交换空间来决定是否答应内存分配请求。

3. 调整交换空间大小:

• 如果物理内存不足,可以适当增加交换空间(Swap Space),但要注意交换空间的速度远低于物理内存,只能作为临时应急措施,长期而言应增加物理内存或优化应用内存使用。

• 使用 swapon 或在 /etc/fstab 中设置,确保交换分区足够应对突发的内存需求。

4. OOM Killer调整:

• 调整OOM Killer的决策策略,通过编辑 /proc//oom_score_adj(或者对于较新内核 /proc//oom_score_adj)文件,可以改变特定进程在OOM Killer决策时的得分,避免重要的服务进程(如PostgreSQL)被优先杀死。

• 设置 sysctl vm.panic_on_oom=0 可以防止系统在触发OOM时直接panic,改为尝试触发OOM Killer。

5. 内存资源限制:

• 在容器环境下,可以通过 Docker 的 -m 或 --memory 参数限制单个容器的最大内存使用量,避免单个容器占用所有系统内存导致其他进程OOM。

• 对于非容器环境,可以考虑使用cgroups限制特定进程组的内存使用上限。

6. 系统层面的内存优化:

• 减少系统服务的内存开销,例如禁用不必要的服务,或者调整它们的内存使用参数。

• 定期检查系统内存泄漏,使用 top、htop、free、smem 等工具监控内存使用情况,发现内存消耗异常的进程应及时处理。

总的来说,操作系统层面的调整主要是通过对内存资源进行合理分配、设置告警阈值、优化内存分配策略以及限制特定进程的内存使用,结合应用层面的优化共同解决PostgreSQL触发的操作系统OOM问题。同时,还需要密切关注系统总体内存使用情况,确保整体系统的稳定运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1035121.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

城市治理/县域治理方案:构建基于AI视频能力的“一张网”,助力新型城市发展

TSINGSEE青犀AI算法中台是一款平台型产品,专注于提供各行业中小场景部署解决方案。平台具备接入广、性能强、支持跨平台、芯片国产化等特点,可提供丰富的视图接入能力和智能分析能力。 平台采用了多项IT高新技术,包括视频编解码技术、嵌入式…

linux删除 buff/cache缓存

1.查看当前内存占用 free -h如图,缓存占用了将近9G,接下来进行清理 释放页缓存 echo 1 > /proc/sys/vm/drop_caches释放dentries和inodes echo 2 > /proc/sys/vm/drop_caches释放所有缓存 echo 3 > /proc/sys/vm/drop_caches再次查看&#…

Linux:TCP的流量控制/滑动窗口/延迟应答

文章目录 流量控制滑动窗口延迟应答 本篇要总结的是对于TCP的一些其他概念进行总结 流量控制 接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送,就会造成丢包, 继而引起丢包重传等等一系列连锁反应 因此TCP支持根据…

如何在比特币上验证ZK Proofs

1. 引言 前序博客有: 基于BitVM的乐观 BTC bridgeBitVM:Bitcoin的链下合约Bitcoin Bridge:治愈还是诅咒?BitVM2:比特币上的无需许可验证以比特币脚本来实现SNARK VerifierClementine:Citrea的基于BitVM的…

element-ui tableData导出为xlsx文件

下载 npm i / yarn add file-saver、xlsx库 引入 import FileSaver from “file-saver”; import XLSX from “xlsx”; const simexport (data) > {// if (data.create_time && data.create_time.length > 0) {// data.start_time parseTime(data.create_tim…

JDK,JRE,JVM 区别和联系【大白话Java面试题】

JDK,JRE,JVM 区别和联系 大白话回答: JDK是开发环境一般开发人员需要,包含开发环境(JDK)和运行环境(JRE),JRE是运行环境,普通用户需要。jre文件夹下的bin文件夹就是JVM的…

搭建电商网站外贸网站用API接口可以实现哪些功能(天猫API接口|京东API接口)

在电商领域,API接口可以实现多种功能,起到连接内外部系统及优化电商业务流程等多种作用,从而来提高电商企业的运营效率。 具体来看,API接口接入可以用来: 商品管理: API接口能够用来获取商品详情等&#…

【原创】基于springboot+vue的会议室预约管理系统

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

AI音乐GPT时刻来临:Suno 快速入门手册!

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【Go】七、包、init函数、匿名函数、闭包

文章目录 1、包2、本质3、init函数4、匿名函数5、闭包 1、包 不同的包,不同的功能和业务,互相import 关于包: package 包名注意点: 建议包名和所在文件夹同名 main函数一定要放在main包下,否则编译报错 go run&a…

如何划分训练集、测试集、验证集

训练集、测试集和验证集是在机器学习和数据科学中常用的术语,用于评估和验证模型的性能。它们通常用于监督学习任务中。 1. 训练集(Training Set):训练集是用于训练机器学习模型的数据集。在训练期间,模型使用训练集中…

若依框架mysql 搜索中文等于不生效

背景&#xff0c;字段存储的是中文 不生效代码如下 <if test"constellation ! null and constellation ! ">AND u.constellation #{constellation}</if> 正确生效的代码如下 <if test"constellation ! null and constellation ! ">A…

瑞吉外卖实战学习--8、人员禁用和启用

前言 1、通过前端页面查看接口 会发现请求方式是put 请求接口是employee 2、检查页面传值 根据浏览器的请求可以看到传值为id和status 2、写put请求&#xff0c;添加修改时间和修改人的id然后传回给后台 /*** 启用和禁用员工账号* param request* param employee* return…

【面试HOT200】数组篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试coding部分的&#xff0c;整理期间苛求每个算法题目&#xff0c;平衡可读性与代码性能&#xff08;leetcode运行复杂度均打败80%以上&#xff09;。 &#x1f970;来源&#xff1a;材料主要源于…

对【AI技术创业】有哪些机会进行分析和引导

文章目录 方向一&#xff1a;行业解决方案,以下是一些常见的行业解决方案&#xff1a;方向二&#xff1a;智能产品和服务,以下是一些智能产品和服务的示例&#xff1a;方向三&#xff1a;教育和培训 1.智能客户服务&#xff1a; 利用自然语言处理&#xff08;NLP&#xff09;和…

京东云16核64G云服务器租用优惠价格500元1个月,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年&#xff0c;35M带宽&#xff0c;配置为&#xff1a;16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京&#xff0c;京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云16核64G云服务器…

Transformers in Vision:A Survey 阅读笔记

ACM上的一篇综述&#xff0c;讨论Transformer在CV上的应用。 摘要&#xff1a; Among their salient benefits,Transformers enable modeling long dependencies between inputsequence elements and support parallel processing of sequence as compared to recurrent networ…

echarts 地图 自己圈地图 乡镇街道

这个是方式是我实在不愿意做的&#xff01; 如果有现成的最好&#xff0c;没有办法的情况下再用这个东西。 今天公司有一个项目&#xff0c;地方划分了一块区域&#xff0c;但是国家没有审核&#xff0c;但是项目里面用到了一个地图展示数据&#xff01;然后就需要我们自己把…

【爬虫框架Scrapy】01 开启Scrapy之路

爬虫基础专栏&#xff1a;http://t.csdnimg.cn/r9gt9 前言 如果你没有爬虫基础&#xff0c;相信我&#xff0c;不要进行下去&#xff0c;没什么意义&#xff0c;你会撞的头破血流&#xff0c;最后破灭你那本就不多的兴趣选择放弃&#xff01;&#xff01;&#xff01; OK&…

3D检测:从pointnet,voxelnet,pointpillar到centerpoint

记录centerpoint学习笔记。目前被引用1275次&#xff0c;非常高。 地址&#xff1a;Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint&#xff1a;三维点云目标检测算法梳理及最新进展&#xff08;CVPR2021&#xff…