PostgreSQL中如何配置Huge page的数量

在了解如在PG中如何配置大页之前,我们先要对大页进行一定的了解,为什么要配置大页,配置大页的好处有哪些。

我们日常的操作系统中,程序不直接使用内存,而是使用虚拟内存地址来处理内存分配,避免计算的复杂性和物理地址映射到应用程序内存空间的复杂性。虚拟地址模型在应用程序读取或写入内存时立即将虚拟地址转换为相应的物理内存地址。这种映射结构存储在page tables中,这是一种分层组织的查找表。

如下图,在运行中的程序使用虚拟内存映射到物理内存

在这里插入图片描述

下图为虚拟内存通过page table映射到物理内存

在这里插入图片描述

地址转换依靠MMU实现,MMU是内存管理单元,是硬件设备,在CPU内部

在这里插入图片描述

如下图,使用MMU使用TLB的加速映射

在这里插入图片描述

下图说明了TLB的加速原理,如果物理地址在TLB中命中,直接转换为物理地址,只访问一次内存地址,否则扫描page table查找地址然后映射条目到TLB,然后再转换为物理地址,这样就有两次内存访问。最差的是page table也没有,需要从磁盘写到page table,那么这样效率会更慢。

在这里插入图片描述

因为TLB只能保存几千个条目,那么我们为了提高性能,可以有两个办法:
  • 增加TLB的大小,升本太高,受限硬件,提升有限
  • 增加内存page的大小,如果TLB只能对应512个页表项,那么能否每个page对应1G的内存呢,这样程序访问512G的内存,也能保证都利用到TLB缓存了。
如下图,4K,2MB,1GB在256GB内存下对应的页面数两

在这里插入图片描述

操作系统上的内存分配都是通过分配单个或多个可用内存页来完成的。这些页面都是特定大小,主要取决于操作系统。在Linux上,内存分配使用的默认页面大小是4kB。
因此,我们可以想象,分配大量内存需要在页表中保存大量页面,以便将它们映射到相应的物理地址。查找虚拟地址需要多次内存访问,与CPU速度相比,这是非常昂贵的。因此,现在的cpu维护一个叫Translation Lookaside Buffer (TLB)的缓存,TLB是一个加速虚拟内存和物理内存之间转换的缓存。

TLB的大小被限制在几千个条目,特别是在具有高内存特定内存工作负载的系统上,很快就会成为瓶颈。例如,像PostgreSQL这样的数据库使用共享缓存池来实现进程间通信(IPC)、块层访问和其他功能,这很快就会给TLB带来很大的压力,因为虚拟地址映射的数量是有限的。特别是共享缓冲池配置大内存(比如100GB的shared buffer)的时候,这些实例可能因此受到性能影响。

所以我们在内存很大的时候,比如有256G内存,可以设置huge page,提高效率。在x86系统上,我们通常可以设置2MB或1GB大小,IBM POWER允许64kB、16MB和16GB。
在x86架构中,配置大页时,默认的页面大小是2MB。可以通过/proc/meminfo获取你的系统当前设置:

cat /proc/meminfo | grep -i HugePage
AnonHugePages: 161792 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB

HugePages_Total为零表示目前没有配置大页面,因此HugePages_Rsvd,HugePages_Free和HugePages_Surp也都为零。Hugepagesize显示了内核中当前为大页面配置的默认大小。在稍后配置大页时,我们将会考虑如何设置这些值。

如下图,可以通过查看/proc/cpuinfo中的flages,是否支持各种大页的尺寸

在这里插入图片描述

PG中大页的使用

PostgreSQL中,只有shared buffer中可以使用大页来分配内存。而work_mem, maintenance_work_mem, autovacuum_work_mem这些动态内存的分配不会使用大页。此外,用于在并行查询工作之间传输数据和通信的动态共享内存段不会自动请求它们,但有一个例外,我将在下一段关于在Linux上为大型页面配置PostgreSQL的内容中描述。还需要在所谓的mmap段中分配共享缓冲区,这是由shared_memory_type参数控制的。这是Linux上的默认设置。系统V共享内存只被PostgreSQL用来初始化一个非常小的共享内存区域;缓冲池本身是通过mmap分配的。

对于Linux上的PostgreSQL,不推通过THP配置大页,因为它不会直接分配大页,而是在需要时提供给它们。THP是可切换的,与显式配置的大页相比,它被认为是一个较慢的选择。在这种情况下,FreeBSD等其他操作系统提供了更好的支持。

在PG15中,数据库关闭状态,可以通过命令直接计算需要大页大小,如下:

 su - postgres/usr/pgsql-15/bin/postgres --shared-buffers=20GB -D $PGDATA -C shared_memory_size_in_huge_pages
10475

PG中通过huge_pages参数配置是否开启大页
try:尝试分配大页,如果不能,则退回到正常的页面分配(目前的默认设置)
on:shared buffer强制使用大页
off:不使用大页

上面计算出需要设置的大页数后,可以通过修改文件来修改大页数量,注意只是临时修改吗,重启无效

 echo 10475 > /proc/sys/vm/nr_hugepages

再次查看大页设置:

grep -i hugepage /proc/meminfo
AnonHugePages:    124928 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:   10475
HugePages_Free:    10475
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

永久修改配置:

cat /etc/sysctl.d/01-nr-hugepages.conf
vm.nr_hugepages=10475

修改 postgresql.conf文件中以下参数

shared_buffers = 20GB
huges_pages = on
huge_page_size = 0 #use default kernel setting

PostgreSQL必须启动(或重新启动),并且应该通过默认的大页大小分配其共享缓冲池。查看/proc/meminfo信息。输出如下:

grep -i hugepage /proc/meminfo
AnonHugePages:    176128 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:   10475
HugePages_Free:    10264
HugePages_Rsvd:    10264
HugePages_Surp:        0
Hugepagesize:       2048 kB

使用pmap工具可以查看postmaster进程分配的内存段

pmap  $(head -n1  /var/lib/pgsql/15/data/postmaster.pid) | grep huge
00007f11a5400000 21452800K rw-s- anon_hugepage (deleted)

在PostgreSQL如何使用大页面的一节中,我们应该解释一下那里提到的异常。通常,动态共享内存分配是有目的的,例如并行查询工作者处理并行查询时。默认情况下,这些动态分配的内存不是由mmap完成的,而是PostgreSQL在Linux上默认通过shm_open()使用posix API。在这种情况下,不分配大页。但是,在并行查询时,也会产生内存压力,特别是在需要处理大量数据时。

从版本14开始,PostgreSQL提供了参数min_dynamic_shared_memory。配置后,指定的值定义了在服务器启动时创建的共享内存中的额外空间,这些空间应该用于并行查询工作。由于它是与缓冲池一起分配的,因此它也使用了大页进行分配。我们可以扩展上面的例子,并重新计算设置2GB的额外共享内存,用于并行查询:

/usr/pgsql-15/bin/postgres -D $PGDATA --min-dynamic-shared-memory=2GB --shared-buffers=20GB -C shared_memory_size_in_huge_pages
11499

同样,需要停止PostgreSQL实例才能成功执行该命令。与前一个示例相比,现在要保留的大页面的数量增加了2GB。

如果PG版本低于15怎么办?

这些版本更难处理。特别是需要保留多少大页的计算比较麻烦。到目前为止,最好的解决方案就是手动启动PostgreSQL,设置huge_pages=on,然后调试参数。在这种情况下,如果不能分配请求的共享内存大小,PostgreSQL打印以下错误消息:

FATAL:  could not map anonymous shared memory: Cannot allocate memory
HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 21965570048 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
LOG:  database system is shut down

注意HINT部分,它告诉我们PostgreSQL想要分配21965570048字节的共享内存。这个值可以用来计算页面的数量。这个数字的问题是,当我们将共享缓冲区指定为20GB时,这比我们所要求的大一些。这是因为PostgreSQL还需要为其他内部进程(如wal_buffers或max_locks_per_transactions)提供额外的共享内存。扩展可能需要额外的共享
内存。PostgreSQL内部使用了一个近似如下的公式:

((shm size + (BLKSZ - (shm size % BLKSZ))) / (huge page size * 1024)) + 1 = num huge pages
#假设我们的数据库的BLKSZ是以8KB的page编译安装的
((21965570048 + (8192 - (21965570048 % 8192))) / (2048 * 1024)) + 1 = 10475
track_activity_query_size设置

另外要注意track_activity_query_size的设置,默认1024,如果超过,那么pg_stat_activity,pg_stat_statements中记录sql的长度会被截断。但是一定要注意,如果加大该设置,会分配max_connections * track_activity_query_size的内存来保存我们的语句。
在这里插入图片描述
如上所述,PostgreSQL使用共享内存来存储这些统计信息。PostgreSQL不能动态更改内存段的大小。因此,更改track_activity_query_size也需要重新启动PostgreSQL。所以在启用实例前,一定要考虑好如何设置该参数。另外还要注意,该参数设置大了,那么pg_stat_statements也会变大,可能也会影响系统性能,一定要注意定期使用该函数重置pg_stat_statements_reset

参考:
https://courses.teresco.org/cs432_f02/lectures/12-memory/12-memory.html
https://www.cybertec-postgresql.com/en/huge-pages-postgresql/
https://www.cybertec-postgresql.com/en/fixing-track_activity_query_size-in-postgresql-conf/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/13324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】初识Docker以及Docker安装与阿里云镜像配置

目录 一、初识Docker 二、安装Docker 三、Docker架构 四、配置Docker镜像加速器 一、初识Docker Docker是一个开源的应用容器引擎,诞生于2013年,基于Go语言实现,dotCloud公司出品,Docker开源让开发者打包他们的应用以及依赖包到…

使用frp中的xtcp映射穿透指定服务实现不依赖公网ip网速的内网穿透p2p

使用frp中的xtcp映射穿透指定服务实现不依赖公网ip网速的内网穿透p2p 管理员Ubuntu配置公网服务端frps配置service自启(可选) 配置内网服务端frpc配置service自启(可选) 使用者配置service自启(可选) 效果 通过frp实现内网client访问另外一个内网服务器 管理员 1)…

vmware磁盘组使用率100%处理

今天在外办事时,有客户发过来一个截图,问vmware 磁盘组空间使用率100%咋办?如下图: 直接回复: 1、首先删除iso文件等 2、若不存在ISO文件等,找个最不重要的虚拟机直接删除,删除后稍等就会释放…

订单30分钟未支付自动取消怎么实现?

目录 了解需求方案 1:数据库轮询方案 2:JDK 的延迟队列方案 3:时间轮算法方案 4:redis 缓存方案 5:使用消息队列 了解需求 在开发中,往往会遇到一些关于延时任务的需求。最全面的Java面试网站 例如 生…

ESP32(MicroPython) 四足机器人(一)

最近决定研究一下四足机器人,但市面上的产品,要么性价比低,要么性能达不到要求。本人就另外买了零件,安装到之前的一个麦克纳姆轮底盘的底板上。(轮子作为装饰,使用铜柱固定) 舵机使用MG996R&a…

使用TensorFlow训练深度学习模型实战(下)

大家好,本文接TensorFlow训练深度学习模型的上半部分继续进行讲述,下面将介绍有关定义深度学习模型、训练模型和评估模型的内容。 定义深度学习模型 数据准备完成后,下一步是使用TensorFlow搭建神经网络模型,搭建模型有两个选项…

x86架构ubuntu22用docker部署zsnes

0. 环境 x86 ubuntu22 1. 安装docker $ sudo apt remove docker docker-engine docker $ sudo apt update $ sudo apt install -y apt-transport-https ca-certificates curl software-properties-common$ curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg …

JDK17 中的新特性初步了解

1. Switch 语句的增强 jdk12 ,switch语句不用写break了,直接写箭头和对应的值。 jdk 17中, 加了一个逗号,用于匹配多对一。 如果要在每个case里写逻辑,可以写在花括号里。 在返回值的前面加上yield的关键字。 也可以对…

多线程案例 | 单例模式、阻塞队列、定时器、线程池

多线程案例 1、案例一:线程安全的单例模式 单例模式 单例模式是设计模式的一种 什么是设计模式? 设计模式好比象棋中的 “棋谱”,红方当头炮,黑方马来跳,针对红方的一些走法,黑方应招的时候有一些固定的…

ScheduledThreadPoolExecutor 及 ThreadPoolExecutor的基本使用及说明

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 为什么不推荐使用Executors去创建线程池 三、…

python进阶书籍的推荐 知乎,python入门后如何进阶

本篇文章给大家谈谈python进阶书籍的推荐 知乎,以及python入门后如何进阶,希望对各位有所帮助,不要忘了收藏本站喔。 1、Python应该怎么学_python应该怎么学 想要学习Python,需要掌握的内容还是比较多的,对于自学的同…

【MySQL】索引特性

​🌠 作者:阿亮joy. 🎆专栏:《零基础入门MySQL》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 👉没…

重大更新|Sui主网即将上线流动性质押,助力资产再流通

Sui社区一直提议官方上线流动质押功能,现在通过SIP过程,已经升级该协议以实现这一功能。 Sui使用委托权益证明机制(DPoS)来选择和奖励负责运营网络的验证节点。为了保障网络安全,验证节点通过质押SUI token获得质押奖…

抖音短视频矩阵系统源码:SEO优化开发解析

抖音短视频矩阵系统源码是一个基于抖音短视频平台的应用程序。它允许用户上传和观看短视频,以及与其他用户交互。SEO优化开发解析是指对该系统进行搜索引擎优化的开发解析。 一、 在进行SEO优化开发解析时,可以考虑以下几点: 关键词优化&…

前端调用合约如何避免出现transaction fail

前言: 作为开发,你一定经历过调用合约的时候发现 gas fee 超出限制,但是不知道报了什么错。这个时候一般都是触发了require错误合约校验。对于用户来说他不理解为什么一笔交易会花费如此大的gas,那我们作为开发如何尽量避免这种情…

Jvm的一些技巧

反编译字节码文件 找到对应的class文件所在的目录,使用javap -v -p 命令 查询运行中某个Java进程的Jvm参数 【案例】查询 MethodAreaDemo 这个类运行过程中,初始的元空间大小 MetaspaceSize jps 查询 Java 进程的进程ID ![在这里插入图片描述](https…

新零售行业如何做会员管理和会员营销

蚓链数字化营销系统全渠道会员管理解决方案,线上线下统一管理,打造私域流量,微信、门店会员全渠道管理,打通私域流量池,实现裂变营销: 开启新零售之路,必然要摒弃原有的管理模式,大…

C# NDArray System.IO.FileLoadException报错原因分析

C# NDArray System.IO.FileLoadException 报错原因分析: 1.NuGet程序包版本有冲突 2.统一项目版本 1.打开解决方案NuGet程序包设置 2.查看是否有版本冲突 3.统一版本冲突

【探讨】Java POI 处理 Excel 中的名称管理器

前言 最近遇到了一些导表的问题。原本的导表工具导不了使用名称管理器的Excel。 首先我们有两个Sheet。B1用的是名称管理器中的AAA, 而B2用的对应的公式。 第二个sheet,名为Test2: 这是一段简化的代码: public class Main {public static void mai…

7.25 Qt

制作一个登陆界面 login.pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on …