PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁

文摘   2024-11-29 06:01   天津  

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2600人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8)(1 2 3 4 5 6群均已爆满,新人进7群,8群 准备开9群)

PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!

咱们上期那位小哥,锲而不舍的问64怎么回事,我一直没说。这不生气了,不搭理我了,不过最近又联系我了,问他们那里的PostgreSQL OOM了,怎么办。还是ORACLE TO PG迁移过程中,他们先导入的数据,后续加的索引,但是只要一加索引就OOM。

错误信息

ERROR:  Out of memory
DETAIL:  Failed on request of size 4096 bytes.
HINT:    You may need to increase maintenance_work_mem parameter.

对话开始


DBA: 老师你说这怎么回事,我们这导入那么大的数据都没事,怎么一加索引就OOM,怎么回事,给看看呗!

我:你把你服务器的参数,服务器的配置说一下,还有把多大的表,怎么加的索引也说一下

DBA: 我们简单,参数没怎么动,我看了一个什么网课,上面人家说的听明白的,说做一些系统维护类的工作,尽量把maintenance_work_mem 调大,这样有利于操作。然后我别的没调,就把这个maintenance_work_mem 调大了。其他的服务器 32G内存,CPU 8核的,还有啥,哦那个数据量不小一个表不到1个亿,有那么10来张表都差不多,都大几千万。

对了这有啥关系,你不会是不会吧,问我这么多,不应该是一看报错,就都明白了,马上说结论了。

我: 你还没说怎么加的索引呢? 怎么加的

DBA: 简单,不就加索引吗 create index idx_tj_name on count_info (systemname,systemstd)。

我:其他的参数你调整了吗?

DBA: 哦想起来了,我还调整了max_parallel_maintenance_workers 这个参数,好像有人说调整这个大了,加索引快。

我:挺好,爱学习哈,我问一句这个参数你调整到多大?

DBA: 我调整成4了,原来是2太小了。

我: 太小了?maintenance_work_mem 你调整到多大? 别调整的太大。

DBA:4G,不多我们32G的内存,整体一共就给分配4G,所以我纳闷怎么就OOM了,4G,这不官方要求的吗,那英文官方文档你没看呀,8分之一,你不知道?

我: 啊,你不会以为是你建立索引的时候最多分配4G吧? 你一次添加了多少索引?

DBA: 16个, 我开了16个PSQL登录建立的,你赶紧告诉我怎么回事,会吗,不会我找别人了,磨磨唧唧,问东问西的。

我: 我给你说,你maintenance_work_mem 设置的有点大了,你减少一下,我算一下哈,稍等 OK ,你把你的maintenance_work_mem 调整成300MB,你在试试应该不会在OOM。嗯,你现在也光是导数,没有业务对吧?也没有访问对吧?

DBA: 啥玩意,就这,我看你也是个半瓶子,说OOM 然后你你就把内存调小了,那我也会,为啥?

我:首先你对maintenance_work_mem的理解是有问题的maintenance_work_mem不是说你添加索引的时候,一共分配多少内存,而是你添加索引时,每个进程可以开到的最大的内存。同时你表不小,还开了16个进程加索引,你这不出事,等什么呢?

DBA:不懂,不就加索引,有那么难,就几条命令,你这说的有根据吗?

我: 听我说

你加索引时采用的create index 命令,你PG应该是新版本吧,我假设你PG16,这个版本是支持并行添加索引的,且有参数可以进行设置,你又开了那么多“窗口”,来人工并行执行添加索引的命令,而你每个添加索引的命令本身也会产生多个子进程来进行工作,这就产生了叠加效应

你自己看一下  16 * 4 * 4G = 256G ,如果其他的条件匹配的话,你会用到256G的内存,且你本身只有32G内存,你不OOM,这就没天理了。你想提速的想法是好的,但你没有弄明白这些参数组合在一起的后果,说明白了吗?

DBA:哦明白了,那我在问一个问题,有没有不调整内存的方法,然后尽量少出问题?

我: 有办法

DBA: 啥办法,还有上次那个64什么意思? 你赶紧说,还有我记得官方文档上建议这个参数是总内存的8分之一,你这个对吗?


总结:“尽信书,则不如无书。” 且 “务要日日知非,日日改过;一日不知非,即一日安于自是;一日无过可改,即一日无步可进。”

PostgreSQL 数据库添加索引有关的参数:

max_worker_processes

max_parallel_maintenance_workers

maintenance_work_mem

这三个参数是与本次故障有关的原因之一,其中max_worker_processes 是PG后台工作进程最大数量,这个参数负责各种任务,包含的类型较多,如autovacuum,vacuum ,复制,逻辑复制,并行查询,添加索引等等一系列工作的进程数的池。

而max_parallel_maintenance_workers,是在进行维护性工作中,每个维护进程可以开的最大的子进程数。

maintennace_work_mem 设置的太大达到4GB,这里指的是每个进程(子进程)可以分配的内存数。在这样的情况下,如果max_worker_processes也调整的很大,且还不知节制的同时并行建立索引,那么必然会出现OOM的问题。

问题:

1 虽然系统没有业务在运行,但整体机器的性能并不能支持,进行16个索引的同时建立,且表的体积也较大的情况下。

2 部分参数调整的太大,尤其maintenance_work_mem,在这样的使用场景下。

最后建议 :

调低 max_parallel_maintenance_workers = 2

       maintenance_work_mem = (500MB ---- 1G)

一次不要同时建立16个索引,改为同时建立4-6个 (这里还未考虑磁盘是否支持这么高的IOPS的需求,假设支持),因为内存消耗过多而到时OOM得情况会得到缓解或不在出现。


PostgreSQL 相关文章


PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!

病毒攻击PostgreSQL暴力破解系统,防范加固系统方案(内附分析日志脚本)
PostgreSQL 远程管理越来越简单,6个自动化脚本开胃菜

PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆

PostgreSQL 如何通过工具来分析PG 内存泄露

PostgreSQL  分组查询可以不进行全表扫描吗?速度提高上千倍?

POSTGRESQL --Austindatabaes 历年文章整理

PostgreSQL  查询语句开发写不好是必然,不是PG的锅

PostgreSQL  字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"
PostgreSQL  Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)
PostgreSQL   玩PG我们是认真的,vacuum 稳定性平台我们有了
PostgreSQL DBA硬扛 垃圾 “开发”,“架构师”,滥用PG 你们滚出 !(附送定期清理连接脚本)

DBA 失职导致 PostgreSQL 日志疯涨


SQL SERVER 系列
SQL SERVER维保AI化,从一段小故事开始
SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗
SQL SERVER 危险中,标题不让发,进入看详情(译)
SQL SERVER 我没有消失,SQL SERVER下一个版本是2025 (功能领先大多数数据库)
SQL SERVER 2022 针对缓存扫描和Query Store 的进步,可以考虑进行版本升级


OceanBase 相关文章


跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)

跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)

跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)

聚焦SaaS类企业数据库选型(技术、成本、合规、地缘政治)

OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
OceanBase  学习记录 -- 安装简易环境
OceanBase  学习记录 --  开始入门
数据库最近第一比较多,OceanBase 定语加多了?
临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
数据库信息速递  阿里巴巴的分布式数据库OceanBase旨在进军中国以外的市场 (翻译)


PolarDB 相关文章


PolarDB-MySQL 并行技巧与内幕--(怎么薅羊毛)

PolarDB 并行黑科技--从百套MySQL撤下说起 (感谢8018个粉丝的支持)

PolarDB 杀疯了,Everywhere Everytime Everydatabase on Serverless

POLARDB  从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS

PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈

PolarDB 从节点Down机后,引起的主从节点强一致的争论

PolarDB serverless 真敢搞,你出圈了你知道吗!!!!

PolarDB VS PostgreSQL  "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?

临时工访谈:PolarDB  Serverless  发现“大”问题了  之 灭妖记 续集

临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一

PolarDB for PostgreSQL  有意思吗?有意思呀
PolarDB  Serverless POC测试中有没有坑与发现的疑问
临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处
POLARDB  到底打倒了谁  PPT 分享 (文字版)

POLARDB  -- Ausitndatabases 历年的文章集合

PolarDB for PostgreSQL  有意思吗?有意思呀

PolarDB  搞那么多复杂磁盘计费的东西,抽筋了吗?


MongoDB 相关文章


MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通

MongoDB 年底活动,免费考试名额 7个公众号获得

MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)

数据库 《三体》“二向箔”  思维限制 !8个公众号联合抽奖送书 建立数据库设计新思维

MongoDB  是外星人,水瓶座,怎么和不按套路出牌的他沟通?

17000多张MongoDB表的锅 自动分析删除表数据难题--从头到尾的处理过程(文尾有MongoDB开发规范)
MongoDB 插入更新数据慢,开发问哪的问题?附带解决方案和脚本
MongoDB 不是软柿子,想替换就替换
MongoDB  挑战传统数据库聚合查询,干不死他们的MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB  双机热备那篇文章是  “毒”
MongoDB   会丢数据吗?在次补刀MongoDB  双机热备
MONGODB  ---- Austindatabases  历年文章合集


MySQL相关文章


MySQL timeout 参数可以让事务不完全回滚
"DBA 是个der" 吵出MySQL主键问题多种解决方案

MySQL 让你还用5.7 出事了吧,用着用着5.7崩了

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验
用MySql不是MySQL, 不用MySQL都是MySQL 横批 哼哼哈哈啊啊
MYSQL  --Austindatabases 历年文章合集

阿里云系列

阿里云数据库产品权限设计缺陷 ,六个场景诠释问题,你可以做的更好?

阿里云数据库--市场营销聊胜于无--3年的使用感受与反馈系列

阿里云数据库产品 对内对外一样的卷 --3年阿里云数据库的使用感受与反馈系列

阿里云数据库使用感受--客户服务问题深入剖析与什么是廉价客户 --3年的使用感受与反馈系列

阿里云数据库使用感受--操作界面有点眼花缭乱 --3年的使用感受与反馈系列





临时工访谈系列

本地存储还有活路吗? 从上周一个供应商问我的问题开始
一年又一年,成了老梆子,别回头,往前看!
临时工说: 实际实例揭穿AI, 上云就不用DBA的谎言
临时工说:DBA 7*24H 给2万的工作,到底去不去?
国内最大IT服务公司-招聘DBA “招聘广告”的变化--分析与探讨
临时工说:  网友问35岁就淘汰,我刚入行DBA 怎么办?

截止今天共发布  1258篇文章



AustinDatabases
PostgreSQL ACE ,PolarDB 3年, OceanBase 极速学习ING, MongoDB 8年经验, MySQL OCP, SQL SERVER, MCITP,REDIS ,做一个合格的数据库架构师
 最新文章