重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 58|回复: 0
打印 上一主题 下一主题

[系统管理] 数据库中透明大页和静态大页

[复制链接]
跳转到指定楼层
楼主
发表于 5 天前 | 只看该作者 回帖奖励 |正序浏览 |阅读模式


数据库中的透明大页与静态大页对比
一、核心概念
静态大页(HugeTLB/HugePages):需管理员手动预分配、锁定在内存中且不参与Swap交换的大页机制,常见大小为2MB或1GB,应用程序需通过hugetlbfs或MAP_HUGETLB显式使用。

透明大页(Transparent HugePages, THP):Linux内核自动管理的大页机制,后台线程khugepaged定期扫描进程地址空间,自动将连续的4KB小页合并为2MB大页,对应用程序透明、无需修改代码。

二、核心差异对比

对比维度        静态大页(HugeTLB)        透明大页(THP)
管理方式        手动预分配,需管理员计算页数并预留内存
内核自动合并/拆分,无需手动干预
页大小        2MB(标准大页)、1GB(巨页)
默认2MB,内核6.6+支持mTHP多尺寸(64KB、2MB等)
内存锁定        锁定不交换(No Swap),物理内存常驻
可被Swap交换(默认)
配置复杂度        高(需计算页数、修改sysctl/GRUB、挂载hugetlbfs)
低(默认启用,通过sysfs开关即可)
性能稳定性        高度可预测,无运行时抖动
可能因后台合并/拆分引入延迟毛刺
内存利用率        低(存在内部碎片,未使用的页无法复用)
高(闲置大页可拆分为小页)
TLB命中率        极高(稳定)        中至高(依赖合并效率)
三、数据库厂商官方建议
1. 静态大页:强烈建议启用(大内存数据库)
Oracle:官方文档明确推荐启用HugePage,尤其SGA超过8GB时——可减少页表开销,避免SGA被Swap,是Oracle RAC和大内存环境的"必配优化项"。
PostgreSQL:当Shared Buffers超过16GB时,建议启用HugePage,减少共享内存的页表维护开销。
MySQL(InnoDB):当Buffer Pool超过16GB时,启用HugePage可降低InnoDB内存管理的CPU开销,尤其适合OLAP场景。
2. THP:多数数据库明确建议禁用
Oracle(12c及之前版本):官方明确不支持THP,可能导致ORA-00600错误或内存泄漏。
MySQL、PostgreSQL、MongoDB:多数OLTP场景下推荐禁用THP,原因包括:
khugepaged后台扫描合并会触发锁竞争和CPU抖动,干扰数据库低延迟响应
THP的延迟分配与写时复制(CoW)在fork()等场景易引发突发延迟
2MB连续物理内存难以满足,长期运行易导致分配失败和内存碎片
监控与诊断失真(/proc/meminfo中AnonHugePages显示非零值但实际使用效果难以判断)
例外场景:

大规模顺序扫描型负载(如ClickHouse、某些Spark场景):连续大内存访问,TLB效率提升可能压倒khugepaged开销。
若需使用THP,建议设置为madvise模式而非always,仅对显式标记的内存区域启用,风险可控。
四、生产配置建议
静态大页配置步骤(以Oracle SGA=20GB为例)
计算页数:20GB / 2MB = 10240页(预留5%冗余,实际配置10752页)

修改sysctl.conf:

vm.nr_hugepages = 10752
vm.hugetlb_shm_group = 54321  # 数据库用户组ID
配置用户限制(/etc/security/limits.conf):

oracle soft memlock unlimited
oracle hard memlock unlimited
GRUB内核参数(重启生效):

default_hugepagesz=2M hugepagesz=2M hugepages=10752
注意:只改sysctl不改GRUB,重启后大页配置会失效。

验证:

bash
grep Huge /proc/meminfo
# 期望输出:HugePages_Total=10752, HugePages_Free=10752
THP关闭步骤(生产数据库推荐)
查看当前状态:

bash
cat /sys/kernel/mm/transparent_hugepage/enabled
临时关闭(立即生效,重启失效):

bash
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久关闭(GRUB参数+rc.local双重保障):

GRUB添加:transparent_hugepage=never
rc.local中添加临时关闭命令
五、总结

场景        推荐方案
内存≥8GB的生产数据库(Oracle/MySQL/PostgreSQL)        静态大页(HugeTLB)+ 关闭THP
内存<8GB的小型数据库        静态大页收益有限,可维持默认
大规模顺序扫描OLAP        可考虑THP的madvise模式,需实测验证
红线警告        静态大页与THP绝对不能同时开启,会导致TLB抖动、CPU飙升、数据库卡顿



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-7-23 23:22 , Processed in 0.307469 second(s), 21 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表