在 Linux 高性能优化里,大页内存是数据库、缓存、虚拟化场景必做的硬核优化项。
一、什么是大页?
Linux 所有进程用的都是虚拟内存地址,CPU 必须把虚拟地址转为物理地址才能访问真实内存。
这个转换靠页表,但页表在普通内存里,查表很慢。
所以CPU内置了一个超高速硬件缓存:TLB(地址转换旁路缓存)。
TLB 作用:
缓存常用的虚拟地址→物理地址映射,让地址转换纳秒级完成。
但存在的问题是:
解决方案:大页内存(HugePages)
也就是把页从4KB放大,常见:2MB 大页、1GB 巨型页。
同样大小内存:
大页核心价值:大幅减少页表项,提TLB命中率,降低CPU开销。
二、两大流派:静态大页 vs 透明大页
1. 静态大页(HugePages)
缺点:会造成内存浪费(用 1KB 也要占 2MB)
2. 透明大页(THP)
缺点:碎片、延迟毛刺、数据库强烈不推荐
两者之间的关系:
大页内存是技术统称
三、场景选型:什么业务用什么?
1、必须用【静态大页】的业务(必须关闭THP)
2、适合用【透明大页】的业务
⚠️红线警告
静态大页与透明大页绝对不能同时开启!
后果:TLB抖动、CPU飙升、数据库卡顿、内存碎片、分配失败。
四、会算才不浪费:大页数量精准计算
1、Oracle 数据库
公式:
SGA大小 ÷ 2MB + 15~30页冗余
示例:SGA=32G
32G ÷ 2M = 16384 页
+20 冗余 = 16404 页
2、Redis / 大堆 Java
Redis:maxmemory ÷ 2MB + 10% 冗余
Java:-Xmx ÷ 2MB + 堆外内存页数
五、生产配置:静态大页永久生效
1.临时配置(重启失效)
sysctl -w vm.nr_hugepages=16404
2.永久配置(sysctl)
vi /etc/sysctl.conf#添加:vm.nr_hugepages = 16400#加载生效:sysctl -p
3.必须加 GRUB 内核参数(关键!)
vi /etc/default/grub#在GRUB_CMDLINE_LINUX=后添加:default_hugepagesz=2M hugepagesz=2M hugepages=16404#更新 GRUB 并重启:grub2-mkconfig -o /boot/grub2/grub.cfgreboot#不配 GRUB → 大页重启失效、分配失败
六、永久关闭透明大页THP
1.临时关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabledecho never > /sys/kernel/mm/transparent_hugepage/defrag
2.永久关闭(GRUB)
vi /etc/default/grub在GRUB_CMDLINE_LINUX=后添加:transparent_hugepage=never更新 GRUB 并重启。grub2-mkconfig -o /boot/grub2/grub.cfgreboot
七、大页状态查看命令
#大页大小grep Hugepagesize /proc/meminfo#完整大页信息cat /proc/meminfo | grep Huge#当前配置页数sysctl vm.nr_hugepages#THP 状态cat /sys/kernel/mm/transparent_hugepage/enabled
参数介绍:
八、高频故障排查
故障 1:大页配置不生效,重启变回 0
只改了sysctl,没改 GRUB
无连续物理内存,内核放弃分配
故障 2:Free很多,但业务申请不到大页
内存碎片化
静态大页必须连续物理内存
故障 3:CPU 莫名高、数据库毛刺
·THP 未关闭,频繁合并拆分 → TLB Miss 暴涨
故障 4:同时开静态 + 透明大页
直接混乱、性能暴跌
必须二选一
九、总结(一张图记住)
4KB 小页:页表多、TLB 容易满、性能差
静态大页:稳、快、无抖动,适合数据库 / 缓存 / 虚拟化
透明大页:自动、省内存,适合通用业务
配置:GRUB + sysctl 双永久
红线:静态与透明绝对不同时开
大页不是玄学,是TLB 命中率的艺术。
算得准、配得对、关得干净,性能直接上一个台阶。