当前位置: 首页 > news >正文

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/

相关文章:

PostgreSQL中如何配置Huge page的数量

在了解如在PG中如何配置大页之前,我们先要对大页进行一定的了解,为什么要配置大页,配置大页的好处有哪些。 我们日常的操作系统中,程序不直接使用内存,而是使用虚拟内存地址来处理内存分配,避免计算的复杂…...

Mysql之binlog日志浅析

一、binlog日志简介 Binlog是MySQL数据库中的二进制日志,用于记录数据库中所有修改操作,包括增删改等操作。binlog以二进制格式保存,可以通过解析binlog文件来查看数据库的操作历史记录。binlog日志可以用于数据恢复、数据备份、数据同步等场…...

js 生成器函数

生成器函数(Generator Function):生成器函数是一种特殊的函数,可以通过yield关键字来暂停和恢复函数的执行,从而实现惰性计算和迭代器的功能。在例子中,我们定义了一个fibonacci生成器函数,它使…...

HCIP OSPF+BGP综合实验

题目 1、该拓扑为公司网络,其中包括公司总部、公司分部以及公司骨干网,不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名,并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中,运行OSPF协议或者BGP协议…...

牛客网Verilog刷题——VL46

牛客网Verilog刷题——VL46 题目解析答案 题目 根据题目提供的双口RAM代码和接口描述,实现同步FIFO,要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。   双口RAM端口说明: 同步FIFO端口说明: 双口RAM代码如下&#xff…...

C/C++开源库推荐

C/C开源库推荐 主要都是平常用到的,包含windows开发、android开发、后台开发、音视频开发、深度学习等等最后还附带几个其他语言开发的比较好的项目 GUI开发 qt 跨平台开发库,内部封装了各种跨平台工具,但是大多数情况下都被用作开发跨平台…...

git常用命令速查表

1.git add -u [<路径>]: 把<路径>中所有跟踪&#xff08;tracked&#xff09;文件中被修改过或已删除文件的信息添加到索引库。它不会处理未跟踪&#xff08;untracked&#xff09;的文件。省略<路径>表示&#xff1a;即当前目录。 2.git add -a [<路径&…...

让两个文件夹里的图片名字一模一样

为了做测试集&#xff0c;对应数据和真值 import os import datetimeimage_names os.listdir(r\Images) #print(image_names) #print(len(image_names))mask_names os.listdir(rG:\Mask) #print(mask_names) #print(len(mask_names))#根据你提供的文件名排序结果来看,问题可…...

会议OA系统会议管理模块开发思路(layui搭建)

目录 一.为什么要进行开发 1.开发目的 2.项目流程 A.发起会议请求过程 1.首先实现我们的多选下拉框功能&#xff01; 2.时间组件功能&#xff0c;并且提交我们新增加的会议内容 3.在进行发起会议编码时遇到的问题&#xff0c;BUG 3.1.有点时候js访问不到路径 3.2在增加…...

rsync 远程同步

目录 一、Rsync 简介 二、同步方式 备份的方式 三、常用Rsync命令 四、配置源的两种表达方法 五、配置服务端与客户端的实验 启动 rsync 服务程序 发起端&#xff08;192.168.158.21&#xff09; ​编辑 六. 发起端&#xff08;客户端&#xff09;配置 rsyncinotify c…...

PostgreSQL数据库中,查询时提示表不存在的解决办法

最近遇到一个奇怪的问题&#xff0c;以前从来没有遇到过&#xff0c;在postgres SCHEMA下执行select * from table1语句时&#xff0c;提示表不存在&#xff0c;而实际这个表确是存在的&#xff0c;只不过是在public SCHEMA下。在public SCHEMA下执行这个sql语句是没有问题的。…...

视频传输网安全防护体系

在电脑、手机信息安全保护得到广泛关注和普及的今天&#xff0c;监控摄像头等设备的安全防护仍为大众所忽略&#xff0c;大量视频监控网络的前端设备和数据没有任何保护&#xff0c;完全暴露在互联网中。 前端IP接入设备与后端业务系统处于直连状态&#xff0c;一旦有攻击者或…...

C# Blazor 学习笔记(1):Blazor基础语法,组件化和生命周期

文章目录 前言基础语法路由Page 页面元素条件生成if / elseforforeach 绑定参数绑定&#xff08;赋值&#xff0c;单向&#xff09;参数绑定&#xff08;双向&#xff09;事件绑定字典绑定 attributes 组件化如何使用Parameter 参数注入使用回调函数组件声明回调组件注入回调组…...

flutter 导出iOS问题2

问题1:The Swift pod FirebaseCoreInternal depends upon GoogleUtilities, which does not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries) 参考 正如上图报错第三方…...

syn报文什么时候会被丢弃?

开启tcp_tw_recycle且在NAT下 tcp_tw_recycle重复利用time_wait sockets&#xff0c;会记录最近的连接时间戳&#xff0c;并丢弃远程主机(PAWS机制)所有不严格大于该时间戳的报文。这意味着如果主机在nat下&#xff0c;那么该nat下所有设备将会受影响 TCP半连接队列满了 在半…...

【C++】开源:Linux端V4L2视频设备库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Linux端V4L2视频设备库。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…...

基于数据驱动的多尺度表示的信号去噪统计方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

文章目录 前言现象原因如何顺序读取推荐阅读 前言 Go 语言中的 map 是一种非常强大的数据结构&#xff0c;它允许我们快速地存储和检索键值对。 然而&#xff0c;当我们遍历 map 时&#xff0c;会有一个有趣的现象&#xff0c;那就是输出的键值对顺序是不确定的。 现象 先看…...

伊语IM即时通讯源码/im商城系统/纯源码IM通讯系统安卓+IOS前端纯原生源码

伊语IM即时通讯源码/im商城系统/纯源码IM通讯系统安卓IOS前端纯原生源码&#xff0c; 后端是java源码。...

C++推理

YOLOv5 OpenCV DNN C导出的 ONNX 模型示例的推理&#xff1a; https://github.com/Hexmagic/ONNX-yolov5/blob/master/src/test.cpphttps://github.com/doleron/yolov5-opencv-cpp-python YOLOv5 OpenVINO C推理示例&#xff1a; GitHub - dacquaviva/yolov5-openvino-cpp-p…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...