为了使PostgreSQL数据库获得最佳性能,需要正确定义操作系统参数。如果操作系统内核参数配置不当,可能会导致数据库服务器性能下降。因此,必须根据数据库服务器及其工作负载配置这些参数。本文将介绍一些可能影响数据库服务器性能的重要内核参数以及如何调整这些参数来提升性能。
注:本文所有命令及参数设置均针对Linux操作系统。
详细信息
1.SHMMAX和SHMALL
SHMMAX是一个内核参数,用于定义一个Linux进程可以分配的单个共享内存段的最大大小。SHMMAX的值以字节为单位。
类似地,SHMALL是另一个用于定义系统范围的共享内存页总量的内核参数。可以使用ipcs命令来查看当前值:
postgres@hyl:~$ ipcs -lm
------ Shared Memory Limits -------- max number of segments = 4096 max seg size (kbytes) = 4177919 max total shared memory (kbytes) = 17112760316 min seg size (bytes) = 1 |
PostgreSQL使用System V IPC(Inter-Process Communication,进程间通信)来分配共享内存。建议根据需要使用的共享内存来调整这些参数值。
如果SHMMAX配置错误,则在尝试使用initdb命令初始化PostgreSQL集群以及使用pg_ctl这类操作时可能会出错。出现此类报错的原因通常是PostgreSQL对共享内存段的请求超出了内核的SHMMAX参数值或者是低于了内核的SHMMIN参数值。解决方式是:
1)如果请求过大,可以减小请求大小或者使用更大的SHMMAX值重新配置内核参数。可以通过降低PostgreSQL共享内存的使用量减小请求大小,也可以通过降低shared_buffers或max_connections参数值来实现。
2)如果请求过小,可以通过提高请求大小或重新配置SHMMIN参数值的方式来解决问题。
sysctl命令可用于临时更改参数的值。要永久设置参数值,请在/etc/sysctl.conf中进行修改。举例如下:
# 获取SHMMAX值 postgres@hyl:~$ sudo sysctl kernel.shmmax kernel.shmmax = 4278190079 # 获取SHMALL值 postgres@hyl:~$ sudo sysctl kernel.shmall kernel.shmall = 4278190079 # 设置SHMMAX值 postgres@hyl:~$ sudo sysctl -w kernel.shmmax=16777216 kernel.shmmax = 16777216 |
2.Huge Pages
Linux默认使用大小为4K的内存页。页面是分配给一个进程的一块内存,一个进程可能拥有多个页面,这取决于它对内存的要求。进程需要的内存越多,分配给它的页面就越多。操作系统持有一个分配给进程的页面的表。页面大小越小,表越大,在该页表中查找页面所需的时间就越多。因此,大页面使得使用大量内存的同时减少开销成为可能。使用大页面之后,页面查找次数更少,页面错误更少,通过更大的缓冲区读取/写入操作更快,这样就提升了数据库的性能。
PostgreSQL仅在Linux上支持更大的页面。默认情况下,Linux使用大小为4K的内存页面,因此在内存操作过多的情况下,需要设置更大的页面。可以使用以下命令来检查Linux机器上的大页面设置和利用率:
postgres@hyl:~$ cat /proc/meminfo | grep -i huge AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB |
从结果中看到,尽管大页面的大小设置为2048kB,但大页面的总数为0,这表示当前设置为禁用了大页面。
接下来启用大页面,首先设置大页面数量。
postgres@hyl:/pgdata$ sudo sysctl -w vm.nr_hugepages=76 vm.nr_hugepages = 76 |
然后检查大页面的信息:
postgres@hyl:/pgdata$ cat /proc/meminfo | grep -i huge AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 76 HugePages_Free: 76 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB |