开发者学堂课程【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,这些重要的参数都设上之后,数据库的优化其实是重点操作系统和这些配置优化。把这些重点参数配上,基本上这个东西就能保证一定的安全性。