暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL中使用大页(HugePage)需要注意哪些地方

数据库杂记 2023-06-23
29

前言

PostgreSQL中使用大页有哪些好处? 需要注意些什么?

分析

PostgreSQL中使用大页(也称为大内存页或大页框)可以带来一些性能优势,特别是在具有大量内存和高负载的系统中。以下是使用大页的一些好处和需要注意的事项:

好处:

  1. 减少TLB(Translation Lookaside Buffer)的压力:TLB是处理器中用于缓存虚拟地址到物理地址映射的高速缓存。大页可以减少TLB条目的数量,从而减少TLB未命中(TLB miss)的机会。这有助于提高内存访问速度并提高应用程序性能。

  2. 减少内存碎片:大页有助于减少内存碎片,从而提高内存分配的效率。

  3. 提高I/O性能:在具有大内存和大数据集的系统中,使用大页可以提高顺序扫描和数据预取(prefetching)的性能。

需要注意的事项:

  1. 系统兼容性:确保操作系统和硬件支持大页。在Linux系统中,需要检查内核是否支持透明大页(Transparent Huge Pages,THP)或巨大TLB(HugeTLB)。

  2. 配置内存分配:在使用大页时,需要正确配置PostgreSQL的内存分配。例如,需要设置huge_pages
    参数以匹配操作系统中可用的大页数量,并适当调整shared_buffers
    参数。

  3. 大页分配策略:在某些情况下,大页的分配策略可能导致内存浪费。例如,如果PostgreSQL需要的内存不足以填满一个大页,那么剩余的内存空间将被浪费。因此,在启用大页时,需要权衡内存效率与性能之间的权衡。

  4. 避免大页的动态分配:在运行时动态分配大页可能导致性能下降。因此,建议在系统启动时预先分配大页,并通过操作系统参数(如Linux中的vm.nr_hugepages
    )来配置。

  5. 监控和调优:在使用大页后,需要持续监控系统性能并进行适当的调优。可以使用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中设置大页参数的方法:

  1. 确认操作系统支持大页。运行以下命令检查系统是否支持透明巨大页(THP):

    cat /sys/kernel/mm/transparent_hugepage/enabled

    如果输出结果包含[always]
    ,表示THP已启用。如果输出结果包含[madvise]
    [never]
    ,表示THP已禁用。

  2. 修改操作系统设置。要在PostgreSQL中使用大页,需要在操作系统层面启用它。根据您的需求,可以选择永久启用或临时启用。

    永久启用:
    编辑/etc/sysctl.conf
    文件,添加以下行:

    vm.nr_hugepages = <hugepages_number>

    其中<hugepages_number>
    是您想要分配的大页数。通常,可以将其设置为系统总内存的一小部分。

    然后运行以下命令使更改生效:

    sudo sysctl -p

    临时启用:
    只需运行以下命令:

    sudo sysctl -w vm.nr_hugepages=<hugepages_number>

    其中<hugepages_number>
    与上述说明相同。

  3. 配置PostgreSQL。编辑postgresql.conf
    文件,设置以下参数:

    huge_pages = on

    这将启用PostgreSQL中的大页支持。

  4. 重启PostgreSQL服务。要使更改生效,需要重启PostgreSQL服务。例如,在Ubuntu和Debian系统上:

    sudo systemctl restart postgresql

    或者在RHEL和CentOS系统上:

    sudo systemctl restart postgresql-<version>

    其中<version>
    是您的PostgreSQL版本。

  5. 验证设置。要检查大页是否正确设置,可以在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)


文章转载自数据库杂记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论