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.mfbz.cn/a/54042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.3 eureka+ribbon,完成服务注册与调用,负载均衡源码追踪

本篇继先前发布的1.2 eureka注册中心,完成服务注册的内容。 目录 环境搭建 采用eurekaribbon的方式,对多个user服务发送请求,并实现负载均衡 负载均衡原理 负载均衡源码追踪 负载均衡策略 如何选择负载均衡策略? 饥饿加载…

windows下tomcat无故宕机,检测http或https服务,并自动重启Tomcat服务

一、问题描述及解决原理 把项目发布到windows服务器中,如tomcat工程不稳定,会有无故宕机的问题。如果通过程序无法解决,并且重启tomcat服务能够生效的话,可以做一个自动检测并重启的脚本。 脚本通过检测tomcat对应的工程链接&…

一文了解Angular、React 和 Vue.js的区别

前端开发人员在开始一个新项目时首先要回答的问题是:我应该选择哪个框架? 哪个框架更适合我的需求? 在本文中,我们将向您快速概述当前使用的最常见的前端框架,旨在帮助您选择最能满足您需求的框架。这些框架是 Angular…

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

PHP8的常量-PHP8知识详解

常量和变量是构成PHP程序的基础,在PHP8中常量的这一节中,主要讲到了定义常量和预定义常量两大知识点。 一、定义常量 定义常量也叫声明常量。在PHP8中,常量就是一个标识符(名字),一旦定义(声明&…

Java常用API:Math、Syetem、Runtime、BigDecimal

Math类 //目标:了解下Nath类提供的常见方法。 // 1、public static int abs(int a):取绝对值(拿到的结果一定是正数) //public static double abs(double a) system.out.println(Math.abs(-12)); // 12 system.out.println(Math.abs(123));// 123 system…

VScode远程不用再输入密码操作

安装插件remote development 1.先检查自己电脑上有没有生成一对公钥和私钥。(一般会在这个目录) 如果没有的话就自己生成一下。 打开命令行输入以下命令 ssh-keygen -t rsa2.在虚拟机中先看一下有没有公钥和私钥。如果没有的话就自己生成一下。 打开…

华为数通HCIA-网络参考模型(TCP/IP)

网络通信模式 作用:指导网络设备的通信; OSI七层模型: 7.应用层:由应用层协议(http、FTP、Telnet.)为应用程序产生对应的数据; 6.表示层:将应用层产生的数据转换成网络设备看得懂…

STM32 USB使用记录:HID类设备(后篇)

文章目录 目的基础说明项目构建与代码调整接收发送代码与测试示例链接报告描述符总结 目的 接上篇: 《STM32 USB使用记录:HID类设备(前篇)》 USB HID 类的设备有个比较大的好处是大部分时候接入主机中都是可以免驱使用的。这篇文…

Shell脚本实现分库分表操作

目录 一,分库备份 二,分库操作 三,分库分表备份 四,备份还原 一,分库备份 #!/bin/bash mysql_cmd-uroot -pzly666666 bak_path/backup/db [ -d ${bak_path} ] || mkdir -p ${bak_path}mysql ${mysql_cmd} -e show…

【图论】BFS中的最短路模型

算法提高课笔记 目录 单源最短路迷宫问题题意思路代码 武士风度的牛题意思路代码 抓住那头牛题意思路代码 多源最短路矩阵距离题意思路代码 双端队列BFS电路维修题意思路代码(加了注释) BFS可以解决边权为1的最短路问题,下面是相关例题 单源…

python-面向对象.继承

继承 1.单继承 父类也叫基类 子类也叫派生类 如下所示,继承的关系: 继承的书写格式: class 子类(父类): 方法 实例: class Animal: def eat(self): print("-----吃-------") def drink(self): print("-----喝…

【100天精通python】Day21:文件及目录操作_文件的权限处理和批量处理

目录 专栏导读 1. 文件的权限处理 1.1 查询文件权限 1.2 修改文件权限 2 文件的批量处理 2.1 使用os模块和os.listdir()函数 2.2 使用glob模块 2.3 使用shutil模块 2.3.1 批量复制文件 2.3.2 批量移动文件 2.3.3 批量删除文件 2.3.4 批量创建目录 专栏导读 专栏订阅…

聊聊拉长LLaMA的一些经验

Sequence Length是指LLM能够处理的文本的最大长度,越长,自然越有优势: 更强的记忆性。更多轮的历史对话被拼接到对话中,减少出现遗忘现象 长文本场景下体验更佳。比如文档问答、小说续写等 当今开源LLM中的当红炸子鸡——LLaMA…

[Docker实现测试部署CI/CD----相关服务器的安装配置(1)]

目录 0、CI/CD系统最终架构图规划IP地址 1、git配置Git下载pycharm配置gitidea配置git 2、GitLab安装与配置主机要求拉取镜像定义 compose.yml启动gitlab浏览器访问并修改密码查看登录密码修改密码 3、SonarQube 安装与配置拉取镜像修改虚拟内存的大小启动SonarQube登录 SonarQ…

2023 蓝桥杯真题B组 C/C++

https://www.dotcpp.com/oj/train/1089/ 题目 3150: 蓝桥杯2023年第十四届省赛真题-冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金 属 O…

价值 1k 嵌入式面试题-计算机网络 OSI

开门见山 请讲下 OSI 各层协议的主要功能? 常见问题 回答不系统回答不确切无法和实际网络协议做关联对应 答题思路 OSI 代表了开放互联系统中信息从一台计算机的一个软件应用流到另一个计算机的另一个软件应用的参考模型 OSI 包含 7 层,每一层负责特…

51单片机学习--串口通信

首先需要配置寄存器: 下面这里SCON配0x40和0x50都可以,因为暂时还不需要接受信息,所以REN置1置0都可 void Uart_Init(void) //4800bps11.0592MHz {PCON | 0x80; //使能波特率倍速位SMODSCON 0x50; //8位数据,可变波特率TMOD & 0x0F…

tinkerCAD案例:29. 摇头娃娃

Research Your Favorite Bobblehead 摇头娃娃 Project Overview: 项目概况: Design and create your favorite Minecraft 3D bobble head. All you need is a computer, 3D printer, spring and your creativity to your favorite Minecraft character in the for…

1、Hadoop3.x 从入门到放弃,第一章:概念

Hadoop3.x从入门到放弃,第一章:概念 一、什么是大数据 1、主要解决什么 大数据主要解决:海量数据的“采集”、“存储” 和 "分析计算" 问题2、大数据特点 1> Volume 大量 2> velocity 高速 3> variety 多样性数据分为…
最新文章