PostgreSQL 性能优化和体系化运维(一)|学习笔记

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 快速学习 PostgreSQL 性能优化和体系化运维(一)

开发者学堂课程【PostgreSQL 实战进阶PostgreSQL 性能优化和体系化运维(一)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/112/detail/1907


PostgreSQL 性能优化和体系化运维(一)

 

内容介绍:

一、操作系统优化

二、数据库配置优化

三、日常操作

四、运维方案

一、操作系统优化:

PostgreSQL 性能优化和体系化运维,操作系统的优化,实际上操作系统优化一般来说是共享内存,一般把它优化一下,还有就是防止这个数据库使用 sysv,把这kemel.shmmax 和 kemel.shmmall 两个参数设下。这个参数实际上 postgresql19.3之后,其实不再大量使用这种类型的共享内存,主要使用 mmap 类型的内存,所以如果是新的版本的这个情况,数据库也可以启动,但如果使用的是较早的greenplum5数据库,建议还是把这两个参数设置好,vm.swappiness=0,表示尽量不用 swap,其实在一般的数据库里面,要避免使用 swap。

第二个参数 overcommit,通常这个 vm.overcommit memory 设置成2,实际上就是不要让这个系统的超申请,因为内存超申请之后,可能比较危险的动作,然后设成2,默认值是零,实际上是申请的内存可以超过这个物理机的内存,但是如果都开始用的时候,就会发生 OM,把一些竞争挤掉,那这个是在数据库里面比较危险的情况。所以一般是设置为2,在这个情况下,其实还需要有一个第二个参数,vm.overcommit_ratio=90,那实际上当你设置这两个参数,它实际上是可以升级的内存是不超过swap的大小,比如举个例子,一个256G 的机器,16G 的 swap,应该把 vm.overcommit_ratio=93,这样256*95%+16=254G 内存,那不会超过254G内存,超过的时候,这个申请的过程就会失败,这样就避免了 OM,这个也是一个比较重要的一个配置。

同时通常建议都使用大页,实际上是有页表的问题,假设一个256G 内存的机器。分配共享内存128G,如果是小页,为4K大小,则有33554432页表项,每个表至少要占四个字节,那页表的大小32M*4=128M。假设有1024个连接。则页表占用128M*1024=128G 内存,那这样的话就相当于一表,总共几集才200多 G,就占128G,马上就会发生 OM。那反过来,如果用2M大小的页表,则有:128G/2M=65536项,65536*4=256K,1024个连接:1024*256K=256M 内存,内存不会特别大,所以通常在 Linux 操作系统里面,都要使用大页。非常建议使用大页,大页的使用也比较简单,配 vm.nr_hugepages 参数,这个东西设为多少值,就有多少个两兆的大页,那通常设置大页不要太大,如果设了很大,但是你没用数据参数的时候,这时候空间会浪费,但如果设的值过小,这个数据库起不来,同时大页是不会被 swap 的,天然是 lock 的,那它的效率相对小页来说比例还要高一些,也不会交换。

实际上还要设一些叫做信号量,因为PG数据库它是多进程的一个数据库,进程与进程之间访问共享内存的时候,它有这种锁机制,那通常这个信号量实际上就是进程之间的锁,要设 kernel.sem 这个参数,这个参数有四个数字,第一个数字实际上是信号集的最大的信号量数,第二个数字整个系统范围内的最大的信号量数,第三个数字在一次调用中所能操作一个信号量集中最大的信号量数,第四个数字是信号集最大数目,信号量集,所谓集就是集合,这个集合里有很多个信号量,那一次性操作,可以操作多个信号量,让他一次性操作改变这个状态。

在这个参数里面通常第一个参数和第三个参数相等的,同时第一个参数乘第三个参数,第四个参数一般要求是 PostgreSQ L 数据库进程数除以16,通常使用假设1万个连接,至少要有625万除16,取个整数600,这个进程数肯定除了连接过来,它起了一个服务进程,它还包括一些管理进程,比方垃圾回收的进程。那函数一般设置就行。

还有就是资源限制 limit 参数,在这个 limit 参数里面,通常把这个能打开文件句柄的值,一般来开成65536软实现和硬实现都是这样,soft nproc 为1131072,然后内存的 memlock 设置程-1,当然有的时候设立 limits.conf 的时候。它有的时候这些参数不一定生效,因为可能还在 limits.d的配置文件,优先级比 limits.conf 要高,这个地方有时候是20-nproc.conf,但有可能是其他的值,这个时候要把值设高一些。然后要检查一下 limits.d 有没有设置,如果没有,把这个设置高,否则这个设置低,limits.conf 里面设高了没用。

实际上操作系统就做这些参数,这里面做了 vm.swappiness=0,其实还有两个参数分别是 fs.aio-max-nr和fs.file-max 的,建议把这两个参数值设置,然后,其他的参数都是共享内存共享内存实际上设成这台机器物理内存,这里要注意一下kernel.shmall 是一个以4K 为单位的页面数,把内存算出来要排除 CK,kernel.shmax 是物理内存的数字,kernel.sem就是说信号量的值,接下来 limits.conf 参数,把 nproc 设置成没限制,前面设置的是131072,这个 nofile 其实可以把它设得更大,在 limits.d 里面,比方这个机器是90,这个文件优先级比刚才那个优先级高,所以这里面如果有什么其他配置,要把配置改动。实际上是在一台数据主机操作系统设置里面,有的时候还要把防火墙关掉,通常是用 stop firewalld 关掉防火墙,很多情况下,还要把 selinux 也关掉,因为安全限制产生奇怪的东西,不是很方便。通常会把它关掉。通常来说这个操作系统层面的优化主要是这些。

 

二、数据库配置优化:

数据库的一些配置的优化。配置其实在数据库比较重要,比如共享内存的东西,一般可以把 shared_buffer 不设置那么大,比如设成4G 到8G 就行。因为其实是 PG 来说,它是使用这个文件缓存过滤,或者这个东西设置大了,有两份缓存,一般当然也可以设成把 shared_buffer 设置很大,那尽量不要让 PG 用这个文件缓存,这是可行的。还有一个就是 work memory 是某一个连接里面的某一个动作,就生成一个4MB。一般保留默认值就行,如果机器内存很多,也可以设大一点,不要太大,防止发生 OM 或内存不够,维护 work memory 其实它是可以在 session 级别设置,当手工改建索引或 vacuum 慢时,可以把这个参数在 session 级别调大。

wal 日志,实际上对应的其他数据库 logical,一般来说我们是保证-1就行,它会自动根据 shared_buffer 的大小自动设置一个合适的大小,一般不需要太大,不超过 wal 文件大小16M了。还有一个最大连接数 max_connections。可以设置的大一些,如为5000,因为每次改的时候会重启机器,其实还有很多的一些参数。

就是 PG 的数据库配置文件,通常端口可以改,还有监听端口一般在生产系统要允许其他机器连接,会把 listen_addresses =’*’,然后可以设一些它的端口最大连接数就可以连接,unix_ socket_directories 这个目录,一般把它改成这个’/tep/’。这些TCP参数的建议还是设一下,比如设置 tcp_keepalives_idle=5、tcp_keepalives_interval=5、

tcp_keepalives_count=3,shared_buffer=32MB,然后

huge_pages就是前面那个大页,但是如果操作系统配大页尽量大于shared_buffer,小的话它这个用不了。然后 walk_mem 保持固定就行。里面也有垃圾回收的参数。还有 max_wal_size和mIn_wal_size 参数,通常把 max_wal_size改大一点,mIn_wal_size 保持稍微大点就可以,比如 max_wal_size 改为10G 或者更大。当然这个值其实是要跟 work_keep_segments 的值配套的。比如work_keep_segments=10,这些重要的参数都设上之后,数据库的优化其实是重点操作系统和这些配置优化。把这些重点参数配上,基本上这个东西就能保证一定的安全性。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
2月前
|
存储 运维 安全
2024-3-18隐语学习笔记:数据可信流通,从运维信任到技术信任
数据要素可信流通,重构技术信任体系。信任四要素:身份可确认,利益可依赖,能力有预期,行为有后果。外循环中四要素遭到破坏,导致信任降级甚至崩塌:责任主体不清,能力参差不齐,利益诉求不一致,责任链路难追溯。数据可信流通 需要从运维信任走向技术信任。
|
2月前
|
运维 监控 Kubernetes
构建高效稳定的云基础设施:自动化运维在企业级应用中的关键实践Kubernetes集群监控与性能优化策略
【5月更文挑战第27天】 随着云计算技术的不断成熟和企业数字化转型的深入,构建一个高效、稳定且可扩展的云基础设施已成为众多组织的核心诉求。本文将重点探讨自动化运维在实现这一目标中的重要作用,通过案例分析展示自动化工具和策略如何优化资源管理、提升服务响应速度以及降低运营成本。文章还将讨论自动化过程中面临的挑战,如安全性、复杂性管理和人员技能提升,并提供针对性的解决方案。
|
11月前
|
关系型数据库 测试技术 分布式数据库
PolarDB | PostgreSQL 高并发队列处理业务的数据库性能优化实践
在电商业务中可能涉及这样的场景, 由于有上下游关系的存在, 1、用户下单后, 上下游厂商会在自己系统中生成一笔订单记录并反馈给对方, 2、在收到反馈订单后, 本地会先缓存反馈的订单记录队列, 3、然后后台再从缓存取出订单并进行处理. 如果是高并发的处理, 因为大家都按一个顺序获取, 容易产生热点, 可能遇到取出队列遇到锁冲突瓶颈、IO扫描浪费、CPU计算浪费的瓶颈. 以及在清除已处理订单后, 索引版本未及时清理导致的回表版本判断带来的IO浪费和CPU运算浪费瓶颈等. 本文将给出“队列处理业务的数据库性能优化”优化方法和demo演示. 性能提升10到20倍.
730 4
|
11月前
|
域名解析 缓存 运维
【运维知识进阶篇】集群架构-Nginx性能优化 (二)
【运维知识进阶篇】集群架构-Nginx性能优化 (二)
127 0
|
11月前
|
缓存 运维 网络协议
【运维知识进阶篇】集群架构-Nginx性能优化 (一)
【运维知识进阶篇】集群架构-Nginx性能优化
175 0
|
存储 缓存 关系型数据库
|
存储 SQL 并行计算
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(中)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
367 0
|
存储 算法 安全
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(下)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
343 0
|
SQL 运维 监控
《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版功能演示(上)——七、常用运维SQL
《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版功能演示(上)——七、常用运维SQL
|
存储 JSON 自然语言处理
【大数据开发运维解决方案】ElasticSearc写入查询性能优化总结
ES(ElasticSearch) 我们需要根据公司要求,进行偏向性的优化。1、bulk批量写入2、多线程写入3、修改索引刷新时间4、修改merge参数以及线程数6、index buffer7、磁盘间的任务均衡8、Mapping优化8.1、自动生成docID(避免ES对自定义ID验证的操作) 8.2、调整字段Mapping 8.3、调整_source字段 8.4、禁用_all 8.5、禁用Norms 8.6、index_options设置 9、优化存储
【大数据开发运维解决方案】ElasticSearc写入查询性能优化总结