Linux透明大页(THP)调优完全指南 1. 概述透明大页Transparent Huge Pages简称THP是Linux内核提供的一项优化内存管理性能的机制。它通过将默认的4KB小页在满足条件的情况下自动合并为较大的页通常为2MB以减少页表项数量、提升TLBTranslation Lookaside Buffer快表命中率从而降低内存访问开销改善系统整体性能。2. 相关配置2.1 功能开关THP的功能开关控制系统是否启用透明大页功能。配置路径/sys/kernel/mm/transparent_hugepage/enabled参数选项说明always所有合适的内存分配都尽可能使用大页。madvise仅当程序显式通过madvise()系统调用请求时才使用大页。never彻底禁用透明大页。2.2 碎片整理由于大页分配需要连续的物理内存区域长时间运行的系统往往因频繁分配和释放导致内存碎片化。碎片整理defragmentation是指内核通过页面迁移等手段合并零散的物理页从而形成足够大的连续区域用于大页分配。碎片整理可能会导致系统延迟上升特别是在前台执行时。配置路径/sys/kernel/mm/transparent_hugepage/defrag参数选项说明always当前线程始终等待内核整理碎片后再分配大页可能严重影响响应时间。defer当前线程不会等待碎片整理在后台异步执行。madvise仅针对显式调用madvise()请求的内存区域进行整理。defermadvise当前线程不等待碎片整理交给后台仅针对明确请求使用大页的内存。never完全不整理碎片若无法直接分配大页则回退为小页。2.3 后台合并线程khugepaged是内核中的后台线程定期扫描匿名内存区域将合适的4KB页自动合并为2MB的大页。相关配置文件目录如下/sys/kernel/mm/transparent_hugepage/khugepaged/关键配置文件defrag功能开关可选的配置项如下1允许khugepaged主动整理内存碎片。0关闭khugepaged主动整理内存碎片功能。alloc_sleep_millisecs重试间隔单位毫秒当分配大页失败时khugepaged下一次尝试分配前的等待时间默认值为60000。pages_to_scan扫描页数khugepaged每次唤醒后扫描的页数默认值为4096。scan_sleep_millisecs扫描间隔单位毫秒用于调节后台扫描频率默认值为10000。说明如业务对延迟敏感可适当加大扫描间隔或关闭khugepaged整理功能。3. 常见场景与调优建议3.1 推荐配置通用业务场景开启madvise模式仅在需要时才使用大页echomadvise/sys/kernel/mm/transparent_hugepage/enabled内存整理使用defermadvise后台合并且仅针对显式请求echodefermadvise/sys/kernel/mm/transparent_hugepage/defrag3.2 数据库或延迟敏感服务数据库如MySQL、PostgreSQL、Redis对性能抖动敏感建议关闭THPechonever/sys/kernel/mm/transparent_hugepage/enabled如需永久关闭可在启动参数中加入sudogrubby--argstransparent_hugepagenever--update-kernel/boot/vmlinuz-$(uname-r)sudoreboot3.3 控制khugepaged活跃度如果系统中khugepaged守护进程的CPU使用率较高时可以考虑以下配置降低khugepaged守护进程活跃度。降低khugepaged扫描频率echo30000/sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs增加分配失败后的重试间隔echo120000/sys/kernel/mm/transparent_hugepage/khugepaged/alloc_sleep_millisecs减少每次扫描页数echo2048/sys/kernel/mm/transparent_hugepage/khugepaged/pages_to_scan禁用khugepaged自动整理功能如确实需要echo0/sys/kernel/mm/transparent_hugepage/khugepaged/defrag4. 查看THP的使用情况查看THP全局使用情况cat/proc/meminfo|grepAnonHugePages返回值为非零表示系统当前存在透明大页使用。查看特定进程是否使用THPcat/proc/PID/smaps|grepAnonHugePages将PID替换为实际进程号可查看该进程哪些内存段正在使用大页。5. THP与内存膨胀说明正常情况下Linux内存页大小是4KB。开启THP后内核会尝试把多个4KB页合并成2MB的大页这样可以减少TLB miss提高性能。在小对象场景下开启THP可能会出现内存膨胀内部碎片并增加OOM风险。1内部碎片一个2MB的大页如果只用了很小一部分其余空间仍然被进程占用不能给其他进程使用。比如普通小页申请8KB → 用两个4KB页 → 基本无浪费。THP申请8KB → 内核分配一个2MB大页 → 实际只用8KB剩下~2MB全算已用。2分配粒度变大THP以2MB为单位分配容易让内存占用迅速膨胀。3内存回收不及时THP的回收和迁移比4KB页更复杂有时候会导致不能及时回收从而表现为内存一直上涨。