技术实践丨PostgreSQL开启Huge Page场景分析
PostgreSQL用户经常发现,服务端在连接数较大的情况下,会出现系统内存消耗过多的情况,严重者可能会造成OOM。但是服务端配置的共享内存(shared_buffers,wal_buffers等)是一定的,为什么内存会持续增加呢?这就与PostgreSQL的多进程架构有关了,下面我们来分析下。
1. 大规格PG实例内存使用率较高分析
为了保证物理内存能得到充分的利用,避免内存空间浪费,Linux把进程当前使用的内存部分加载到物理内存里,而不使用的部分则暂不加载。PostMaster进程注册共享内存时,系统只是分配一个虚拟的地址空间,并不直接分配物理内存。当有实际的内存访问时,CPU才会将虚拟地址映射到物理内存的一个地址上。维护这个映射关系的就是PageTable,它负责将虚拟内存地址转换成物理内存地址。
Linux的内存管理采取的是分页存取机制:把较大的物理内存分为了一个个固定大小(4kB)的内存页进行管理。每块内存页通过PageTable中的一个元组来维护虚拟/物理内存之间的映射。CPU为了提高虚拟/物理内存之间的转换效率,也会在TLB中缓存一定量的Page Table元组。
对于PostgreSQL这种多进程架构程序来说,当服务端使用的共享内存较大,且并发连接数较多时,由于操作系统对于每个进程都要维护单独的内存映射,PageTable中的元组数目将会变得非常多,所占用的内存大小也会特别大。
2. Huge Page改善措施
Linux为了应对这种场景,降低多进程下PageTable的内存消耗。自从2.6及以上内核版本提供了内存页大小为2MB的管理方式,称为Huge Page。如果使用Huge Page的话,相同物理内存使用量的情况下内存页的数目变少,减少了PageTable元组的条目个数,从而降低了系统的内存占用。
作为世界上最先进的开源数据库,PostgreSQL也适配了Linux的Huge Page特性,服务端在注册共享内存时,会通过配置参数huge_pages来决定是否申请大页内存。
postgresql.conf:huge_pages = on -- 注册共享内存时必须使用大页huge_pages = try -- 注册共享内存时首先考虑大页,若系统提供的大页内存不足时,则全部使用普通页huge_pages = off -- 注册共享内存时不使用大页
真实应用场景:某PG用户将实例(shared_buffers = 64GB)部署在一台内存为256GB的ECS上,业务繁忙时ECS内存使用率为85%,PageTable占用内存120GB。而开启Huge Page后相同业务场景的内存使用率降低到50%以下,PageTable大小仅300M!
3. PG实例开启Huge Page操作步骤
(1)查看操作系统的Huge Page大小grep Hugepage /proc/meminfo
(2)估算PostgreSQL实例需要的Huge Page使用量:128GB/2MB * 1.2 = 78643
(3)/etc/sysctl.conf中添加:vm.nr_hugepages = 78643
(4)重新加载系统配置参数:sysctl –p
(5)确认是否配置成功。可以看到Huge Page总数为78643
(6)确认PG配置文件打开huge_pages
(7)启动PostgreSQL服务端,可以看到系统中的空闲Huge Page已经减少,部分大页已经被共享内存使用。
4. Huge Page使用建议
虽然Huge Page在一定场景下可以改善服务端内存使用过高的情况,但不是鼓励所有的PG实例都使用大页,盲目的开启Huge Page可能引起服务端的性能下降。下面我们根据Huge Page的优缺点来分析下使用场景。
Huge Page优势:
(1)CPU的TLB可以缓存的物理地址空间更大,从而提升TLB的命中率,降低CPU负载;
(2)Huge Page使用的内存是不可交换(swap)的,没有内存空间换入/换出的开销;
(3)极大的减少了系统维护PageTable的内存开销。
Huge Page劣势:
(1)Huge Page使用的内存需要预先分配;
(2)Huge Page使用固定大小的内存区域,不会被释放;
(3)对于写密集型的场景,Huge Page会加大Cache写冲突的发生概率。
所以强烈推荐PG实例开启Huge Page的场景:共享内存使用较大(>=8GB)且连接数较多(>= 500),并且热点数据分散。不推荐PG实例开启Huge Page的场景:写业务密集,热点数据集中且内存使用较小。
5.PG开启Huge Page时的注意事项
(1)当配置参数huge_pages设置为on时,若PG启动时需要注册的共享内存大于操作系统提供的Huge Page大小时,数据库将无法启动。推荐将huge_pages参数设置为try,在此种场景下,PostMaster将会改为申请普通内存。
(2)修改shared_buffers/wal_buffers等共享内存相关的GUC参数时,需要重新计算操作系统所需的Huge Page数,以防服务端无法启动或者部分大页内存没有被使用且无法释放而造成浪费。
点击关注,第一时间了解华为云新鲜技术~
技术实践丨PostgreSQL开启Huge Page场景分析相关推荐
- 技术实践丨PostgreSQL插件之pg_dirtyread “闪回查询“
摘要:Oracle数据库有时候不小心删除掉数据,想查询这些数据,或者恢复数据,就可以使用带有as of子句的select语句进行闪回查询. PG粉有福了,下面介绍一种类似"闪回查询" ...
- 技术实践 | 网易云信在融合通信场景下的探索和实践之 RTMPGateway 服务架构
导读:随着各个行业的互联网化进程不断演进,融合通信在越来越多的场景中得到应用,例如金融场景的视频面签.医疗场景的远程会诊.企业协作场景的多人视频会议等. 文|本森 网易云信资深音视频服务端开发工程师 ...
- 技术实践丨列存表并发更新时的锁等待问题原理
本文分享自华为云社区<列存表并发更新时时的锁等待问题原理>,原文作者:PFloyd . 当开启transaction,执行updata的语句执行成功,不执行commit或rollback: ...
- 技术实践丨Prometheus+Grafana搭建HBase监控仪表盘
摘要:Grafana+Prometheus是目前非常流行的监控方案,图形化展示非常强大. 本文分享自华为云社区<Prometheus+Grafana搭建HBase监控仪表盘>,原文作者:L ...
- 技术实践丨基于MindSpore框架Yolov3-darknet模型的篮球动作检测体验
摘要:通过对篮球动作的分类训练及识别检测实例的讲解和体验,使我们了解了Yolov3模型的原理.架构等基本知识,为日后的深入学习奠定了基础. 背靠全新的设计理念,华为云推出了 MindSpore深度学习 ...
- 技术实践丨GaussDB(DWS)运维管理功能“升级”的原理和使用
摘要:本文将详细介绍GaussDB(DWS)重要运维管理功能"升级"的原理和使用. 运维管理模块是任何软件产品最基础和重要的一部分.是软件产品的门户,也是用户接触和使用软件产品的和 ...
- yolov3模型识别不出训练图片_技术实践丨基于MindSpore框架Yolov3-darknet模型的篮球动作检测体验...
摘要:通过对篮球动作的分类训练及识别检测实例的讲解和体验,使我们了解了Yolov3模型的原理.架构等基本知识,为日后的深入学习奠定了基础. 背靠全新的设计理念,华为云推出了 MindSpore深度学习 ...
- 技术实践丨体验量子神经网络在自然语言处理中的应用
摘要:本文从零带你体验量子神经网络在自然语言处理中的应用 本文分享自华为云社区<体验量子神经网络在自然语言处理中的应用>,原文作者:JeffDing. 本文从零带你体验量子神经网络在自然语 ...
- 技术实践丨如何解决异步接口请求快慢不均导致的数据错误问题?
本文分享自华为云社区<如何解决异步接口请求快慢不均导致的数据错误问题?>,原文作者:Kagol . 引言 搜索功能,我想很多业务都会涉及,这个功能的特点是: 用户可以在输入框中输入一个关键 ...
最新文章
- Hibernate基本原理(一)
- python爬虫鼠标模拟悬停并点击
- json list格式_来来来,一文让你读懂Cocos Creator如何读写JSON文件
- log4j debug写法
- 不藏了,这些Java反射用法总结都告诉你们
- linux java.net.bind,False java.net.BindException:已在Jetty上使用的地...
- 东北大学 16春学期《实用写作》在线作业1-3 答案
- 《别输在不会表达上》— 综合素质提升书籍
- Power Tools for TFS 11 Beta
- LINUX7安装APACHE
- 「开源资讯」Apache Storm 2.2.0 发布,分布式实时计算
- 如何在linux运行exe文件,在Deepin系统下直接运行exe文件的方法
- 海康威视摄像头web端播放
- PHP自动化代码审计工具
- AFM测试探针简介-科学指南针
- 使用adb安装apk报错:INSTALL_FAILED_INVALID_URI
- python+django+动态生成word
- 树莓派/arm设备上安装火狐Firefox浏览器
- 什么是Data Matrix二维码
- 爬虫——bs4测试——test.html
热门文章
- Bootstrap显示或隐藏内容
- Bootstrap 多级下拉菜单
- es6 方法的 name 属性
- 用条件运算符编写java程序_Java 编程入门课程丨第 8 单元:条件运算符和控制语句...
- c语言数组电脑显示不出来,C语言有关结构数组的一个程序为什么运行什么结果都不显示?求助~...
- mysql innodb和myisam区别_MySQL?存储引擎简介
- 大疆Onboard SDK开发中连接飞控后串口设置与开机自启动
- 旋翼机自主着陆-主要技术难点
- 每天学点Shiro-集成spring
- 符号扩展和无符号扩展