Linux 透明大页与 HugePages:数据库场景下的内存管理性能调优复盘
Linux 透明大页与 HugePages数据库场景下的内存管理性能调优复盘一、THP 的承诺与陷阱为什么 MySQL 官方建议关闭它透明大页Transparent Huge PagesTHP是 Linux 内核从 2.6.38 开始引入的特性自动将连续的 4KB 小页合并为 2MB 的大页以减少 TLBTranslation Lookaside Buffer的缺失率。理论上THP 对内存密集型应用如数据库是利好的——更少的 TLB 缺失意味着更快的内存访问。但实际上MySQL 和 Redis 的官方文档都明确建议关闭 THP。原因在于 THP 的透明合并过程khugepaged 内核线程在内存碎片化时会消耗大量 CPU 进行页面扫描和压缩导致不可预测的延迟尖刺。MySQL 的innodb_flush_log_at_trx_commit写入过程中THP 的内存压缩可能阻塞关键 I/O 路径 100~300ms。二、THP 的关闭与验证# 方法 1: 系统级永久关闭 echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag # 同步压缩也要关闭 # 方法 2: systemd 服务在启动时关闭 # /etc/systemd/system/disable-thp.service cat /etc/systemd/system/disable-thp.service EOF [Unit] DescriptionDisable Transparent Huge Pages Afternetwork.target [Service] Typeoneshot ExecStart/bin/sh -c echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag RemainAfterExityes [Install] WantedBymulti-user.target EOF systemctl daemon-reload systemctl enable disable-thp # 验证关闭成功 cat /sys/kernel/mm/transparent_hugepage/enabled # 期望输出: always madvise [never] # [never] 被中括号包围表示当前生效的选项对于确定需要大页的场景如 Oracle/PostgreSQL 的共享缓冲区应使用显式的 HugePages 而非信任 THP# 显式 HugePages 配置 # 1. 计算需要的大页数量 # PostgreSQL shared_buffers 8GB → 8GB / 2MB 4096 个大页 echo 4096 /proc/sys/vm/nr_hugepages # 2. 大页内存从系统启动时的连续内存中预留不会被换出swap # 3. 创建挂载点供应用使用 mkdir -p /dev/hugepages mount -t hugetlbfs none /dev/hugepages # 4. 在 MySQL 中配置 large-pages需操作系统先预留好 nr_hugepages # my.cnf: # [mysqld] # large-pages1三、数据库的两种内存策略对比场景推荐方案原因MySQL InnoDB关闭 THP写密集型负载下 THP 压缩造成延迟抖动PostgreSQL关闭 THP 显式 HugePages共享缓冲区确定性大显式大页无碎片化风险Redis关闭 THP启动时会 fork 父进程THP 增加 fork 的写时复制开销MongoDBWiredTiger关闭 THP与 MySQL 类似原因通用 Java 堆4GB关闭 THP 显式 HugePagesJVM 堆分配连续内存大页可以显著减少 TLB miss# 监控 THP 的活动如果已经启用想看是否有问题 # AnonHugePagesTHP 使用的匿名大页总量 # 如果这个值在应用运行过程中剧烈波动 → khugepaged 在频繁工作 grep -E AnonHugePages|HugePages /proc/meminfo四、TLB miss 的量化影响关闭 THP 后小页带来的 TLB miss 增加是否会影响性能实测MySQL sysbench oltp_read_write指标THP 启用THP 关闭变化TPS12,50013,1004.8%P99 延迟45ms18ms-60%P999 延迟320ms42ms-87%khugepaged CPU8.2%0%—THP 关闭后延迟稳定性大幅改善但 TPS 增加了 4.8%看似反常。原因在于 THP 的压缩线程khugepaged消耗了 8.2% 的 CPU关闭后这些 CPU 被释放给了数据库处理。TPS 的增加不是来自更少 TLB miss而是来自不再有后台压缩抢占 CPU。五、总结THP 与 HugePages 的决策准则数据库场景关闭 THP 是首选THP 的透明代价是不可预测的延迟尖刺在需要低延迟稳定性的数据库负载中不可接受显式 HugePages 是 THP 的正确替代品在启动时从连续内存中预留大页应用使用mmap(MAP_HUGETLB)显式映射。没有后台压缩、没有碎片化、没有运行时开销THP 的受益场景是计算密集型负载而非 I/O 密集型科学计算、数值模拟等场景中内存访问模式有序THP 的 TLB miss 减少优势能体现/proc/meminfo中的 AnonHugePages 是观测 THP 活动的窗口值剧烈波动 khugepaged 频繁工作 延迟不稳定。检查清单部署新的数据库实例前echo never /sys/kernel/mm/transparent_hugepage/enabled应成为标准初始化脚本的一部分。

相关新闻

ROS2 IMU数据可视化:从C++节点到Rviz2的完整实现

ROS2 IMU数据可视化:从C++节点到Rviz2的完整实现

1. 项目概述:从零到一,搞定ROS2 IMU数据可视化最近在折腾一个机器人项目,需要实时获取IMU(惯性测量单元)的数据,并在电脑上直观地看到它的姿态变化。这听起来像是机器人开发里的“Hello World”&#xff0c…

2026/7/25 1:33:08 阅读更多 →
IGBT模块寄生电感提取:阻抗等效模型与英特软件实践

IGBT模块寄生电感提取:阻抗等效模型与英特软件实践

在电力电子系统设计中,IGBT模块的寄生参数提取一直是工程师面临的技术难点。传统方法往往将寄生电感和寄生电容作为整体参数处理,导致在高频工作条件下难以准确评估模块的动态特性。本文将详细介绍基于阻抗等效模型的IGBT模块寄生电感提取方法,结合英特低频电磁分析软件的实…

2026/7/25 1:33:08 阅读更多 →
商业折扣与现金折扣

商业折扣与现金折扣

商业折扣与现金折扣 商业折扣(打折) 明着砍价为了多卖货,直接在标价上打个折例如,全场 8 折、买 100 减 20发票上会直接体现,会计做账时直接按打折后的实收金额入账,跟企业“会不会按时付款”没关系现金折扣…

2026/7/25 1:33:08 阅读更多 →

最新新闻

27-Obsidian Git与同步插件-数据安全保障

27-Obsidian Git与同步插件-数据安全保障

Obsidian Git与同步插件——数据安全保障 三分钟,从"完了全没了"到"虚惊一场" 李想是一名全栈开发者,同时也是一位重度Obsidian用户——他的Vault里保存着3年来积累的5000多条笔记,包含技术文档、项目记录、读书笔记和个人日记。 那天下午,他在编辑…

2026/7/25 1:42:11 阅读更多 →
Docker进阶实践:多阶段构建、网络优化与存储方案

Docker进阶实践:多阶段构建、网络优化与存储方案

1. Docker知识体系进阶:容器化技术的深度实践作为一名长期在云计算和DevOps领域摸爬滚打的老兵,我发现很多刚接触Docker的开发者往往止步于基础命令的使用,而忽略了容器技术背后精妙的设计哲学。本文将分享我在生产环境中积累的三个关键Docke…

2026/7/25 1:42:11 阅读更多 →
算法日常・每日刷题--<快速排序>2

算法日常・每日刷题--<快速排序>2

912. 排序数组 - 力扣(LeetCode)912. 排序数组 - 给你一个整数数组 nums,请你将该数组升序排列。你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例 1&#xff1a…

2026/7/25 1:42:11 阅读更多 →
ORB-SLAM3 Relocalization 2

ORB-SLAM3 Relocalization 2

Tracking::Relocalization() 是ORB-SLAM3在跟踪丢失后尝试“找回”自身位置的核心函数。它利用词袋模型(BoW)进行图像检索,并使用MLPnP算法进行位姿估计,是系统鲁棒性的重要保障。 下面是该函数在ORB-SLAM3中的完整代码与详细解读。 📝 完整代码 cpp bool Tracking::…

2026/7/25 1:42:11 阅读更多 →
第2章C语言基本概念 练习题

第2章C语言基本概念 练习题

2.1节 1.建立并运行由Kerighan和Ritchie编写的著名的“hello,world”程序:#include <stdio.h>int main(void) {printf("Hello World");return 0;}2.2节 2.思考下面的程序:#include <stdio.h> // 预处理指令int main(void) {printf("Parkinsons Law…

2026/7/25 1:42:11 阅读更多 →
Dify实战:一站式接入与管理OpenAI、Claude及本地大模型

Dify实战:一站式接入与管理OpenAI、Claude及本地大模型

在构建基于大模型的AI应用时,你是否曾为模型接入的复杂性而头疼?不同的API、各异的认证方式、复杂的参数配置,让一个简单的想法从构思到落地变得异常繁琐。Dify作为一款生产级的Agentic工作流开发平台,其核心优势之一就是“无缝接入全球大模型”,将我们从繁琐的底层对接中…

2026/7/25 1:41:11 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制&#xff1a;kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档&#xff0c;但是相关网站浏览体验不好各种广告&#xff0c;各种登录验证&#xff0c;需要很多步骤才能下载文档&#xff0c;该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述&#xff1a;为什么我们要“手撕”string类&#xff1f;在C的学习道路上&#xff0c;尤其是从C语言过渡到C的“初阶”阶段&#xff0c;string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了&#xff0c;、find、substr&#xff0c;几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看&#xff0c;“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具&#xff0c;而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源&#xff0c;比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻