
前言
PostgreSQL中使用大页有哪些好处? 需要注意些什么?
分析
PostgreSQL中使用大页(也称为大内存页或大页框)可以带来一些性能优势,特别是在具有大量内存和高负载的系统中。以下是使用大页的一些好处和需要注意的事项:
好处:
减少TLB(Translation Lookaside Buffer)的压力:TLB是处理器中用于缓存虚拟地址到物理地址映射的高速缓存。大页可以减少TLB条目的数量,从而减少TLB未命中(TLB miss)的机会。这有助于提高内存访问速度并提高应用程序性能。
减少内存碎片:大页有助于减少内存碎片,从而提高内存分配的效率。
提高I/O性能:在具有大内存和大数据集的系统中,使用大页可以提高顺序扫描和数据预取(prefetching)的性能。
需要注意的事项:
系统兼容性:确保操作系统和硬件支持大页。在Linux系统中,需要检查内核是否支持透明大页(Transparent Huge Pages,THP)或巨大TLB(HugeTLB)。
配置内存分配:在使用大页时,需要正确配置PostgreSQL的内存分配。例如,需要设置
huge_pages
参数以匹配操作系统中可用的大页数量,并适当调整shared_buffers
参数。大页分配策略:在某些情况下,大页的分配策略可能导致内存浪费。例如,如果PostgreSQL需要的内存不足以填满一个大页,那么剩余的内存空间将被浪费。因此,在启用大页时,需要权衡内存效率与性能之间的权衡。
避免大页的动态分配:在运行时动态分配大页可能导致性能下降。因此,建议在系统启动时预先分配大页,并通过操作系统参数(如Linux中的
vm.nr_hugepages
)来配置。监控和调优:在使用大页后,需要持续监控系统性能并进行适当的调优。可以使用PostgreSQL的统计信息和操作系统提供的监控工具来评估大页的影响。
总之,使用大页可以提高PostgreSQL在具有大量内存和高负载的系统中的性能。在启用大页之前,请确保了解可能的影响,并根据系统需求进行适当的调优。
如何确定Linux内核是否支持透明大页(THP)?
在Linux系统中,要检查内核是否支持透明大页(Transparent Huge Pages, THP),您可以查看/sys/kernel/mm/transparent_hugepage/enabled
文件。通过以下命令,您可以获取当前的透明大页状态:
cat /sys/kernel/mm/transparent_hugepage/enabled
输出可能如下所示:
always madvise [never]
括号中的选项表示当前的透明大页设置。在这个例子中,透明大页被设置为never
,这意味着透明大页功能是关闭的。其他可能的选项包括:
always
:透明大页始终启用。madvise
:当应用程序使用madvise
系统调用请求透明大页时,透明大页才会启用。
如果您没有找到/sys/kernel/mm/transparent_hugepage/enabled
文件,可能是因为您的内核版本不支持透明大页功能,或者在编译内核时未启用该功能。要查看内核版本,请运行:
uname -r
请注意,根据您的系统和应用程序需求,透明大页可能会对性能产生正面或负面的影响。在某些情况下,禁用透明大页可能会带来更好的性能。因此,在改变透明大页设置之前,请务必了解它对您的系统可能产生的影响。
PostgreSQL中如何设置大页参数?
在PostgreSQL中,可以通过设置配置参数来启用大页支持(Transparent Huge Pages, THP),这有助于提高内存管理性能。以下是如何在PostgreSQL中设置大页参数的方法:
确认操作系统支持大页。运行以下命令检查系统是否支持透明巨大页(THP):
cat /sys/kernel/mm/transparent_hugepage/enabled如果输出结果包含
[always]
,表示THP已启用。如果输出结果包含[madvise]
或[never]
,表示THP已禁用。修改操作系统设置。要在PostgreSQL中使用大页,需要在操作系统层面启用它。根据您的需求,可以选择永久启用或临时启用。
永久启用:
编辑/etc/sysctl.conf
文件,添加以下行:vm.nr_hugepages = <hugepages_number>其中
<hugepages_number>
是您想要分配的大页数。通常,可以将其设置为系统总内存的一小部分。然后运行以下命令使更改生效:
sudo sysctl -p临时启用:
只需运行以下命令:sudo sysctl -w vm.nr_hugepages=<hugepages_number>其中
<hugepages_number>
与上述说明相同。配置PostgreSQL。编辑
postgresql.conf
文件,设置以下参数:huge_pages = on这将启用PostgreSQL中的大页支持。
重启PostgreSQL服务。要使更改生效,需要重启PostgreSQL服务。例如,在Ubuntu和Debian系统上:
sudo systemctl restart postgresql或者在RHEL和CentOS系统上:
sudo systemctl restart postgresql-<version>其中
<version>
是您的PostgreSQL版本。验证设置。要检查大页是否正确设置,可以在PostgreSQL中运行以下查询:
SHOW huge_pages;如果结果是
on
,则大页已成功设置。
请注意,启用大页可能会导致内存碎片和可用内存减少。请根据您的实际需求和系统资源谨慎设置大页参数。
PG文档第19章4.5部分的内容
当使用大的连续内存块时,使用大的页面可以减少开销,就像PostgreSQL那样,特别是当使用大的shared_buffers值时。要在PostgreSQL中使用这个特性,你需要一个带有CONFIG_HUGETLBFS=y和CONFIG_HUGETLB_PAGE=y的内核。您还必须配置操作系统,以提供所需大小的足够大的页面。为了估计需要的大页面的数量,启动PostgreSQL时不启用大页面,并检查postmaster的匿名共享内存段大小,以及系统默认和支持的大页面大小,使用/proc和/sys文件系统。这可能看起来像:
$ head -1 $PGDATA/postmaster.pid
4170
$ pmap 4170 | awk '/rw-s/ && /zero/ {print $2}'
6490428K
$ grep ^Hugepagesize /proc/meminfo
Hugepagesize: 2048 kB
$ ls /sys/kernel/mm/hugepages
hugepages-1048576kB hugepages-2048kB
在本例中,默认值是2MB,但是您也可以使用huge_page_size显式地请求2MB或1GB。假设有2MB的大页面,那么6490428 2048大约等于3169.154,所以在这个例子中,我们至少需要3170个大页面。如果机器上的其他程序也需要较大的页面,则需要设置更大的设置。我们可以这样设置:
# sysctl -w vm.nr_hugepages=3170
不要忘记将此设置添加到/etc/sysctl.conf中,以便在重启后重新应用它。对于非默认的巨大页面大小,我们可以使用:
# echo 3170 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
也可以在引导时使用内核参数(如hugepagesz=2M hugepages=3170)提供这些设置。
有时,由于碎片,内核无法立即分配所需数量的大页面,因此可能需要重复该命令或重新启动。(重启后,机器的大部分内存应该可以立即转换成大页面。)要验证给定大小的大页面分配情况,使用:
$ cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
还可能需要通过设置vm来授予数据库服务器的操作系统用户使用大页面的权限。通过sysctl设置Hugetlb_shm_group,并/或使用ulimit -l授予内存锁定权限。
PostgreSQL对于大页面的默认行为是尽可能使用它们,使用系统默认的大页面大小,并在失败时退回到正常页面。要强制使用大页面,可以在postgresql.conf中将huge_pages设置为on。注意,在这个设置下,如果没有足够大的页面可用,PostgreSQL将无法启动。
有关Linux巨页特性的详细描述,请访问https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt。
参考:
1.https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt (https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt)
2.https://www.postgresql.org/docs/14/kernel-resources.html (https://www.postgresql.org/docs/14/kernel-resources.html)





