当前位置:首页>Linux>【技术分享】Linux 之大页内存

【技术分享】Linux 之大页内存

  • 2026-10-11 08:21:53
【技术分享】Linux 之大页内存

在 Linux 高性能优化里,大页内存是数据库、缓存、虚拟化场景必做的硬核优化项。

一、什么是大页?

Linux 所有进程用的都是虚拟内存地址,CPU 必须把虚拟地址转为物理地址才能访问真实内存。

这个转换靠页表,但页表在普通内存里,查表很慢。

所以CPU内置了一个超高速硬件缓存:TLB(地址转换旁路缓存)。

TLB 作用:

缓存常用的虚拟地址→物理地址映射,让地址转换纳秒级完成。

但存在的问题是:

  • Linux默认页大小:4KB

  • 内存越大、进程越多 → 页表条目爆炸级别增长

  • TLB 硬件容量固定有限(CPU硬件参数决定) → 会导致大量TLB Miss

  • CPU 空转、性能暴跌、延迟毛刺

解决方案:大页内存(HugePages)

也就是把页从4KB放大,常见:2MB 大页、1GB 巨型页。

同样大小内存:

  • 4KB页:页表条目极多

  • 2MB大页:页数量减少512倍

  • 1GB巨型页:页数量减少262144倍

大页核心价值:大幅减少页表项,提TLB命中率,降低CPU开销。

二、两大流派:静态大页 vs 透明大页

1. 静态大页(HugePages)

  • 手动配置、开机预先锁定连续物理内存

  • 不拆分、不合并、稳定无抖动

  • 性能最强、适合生产核心业务

缺点:会造成内存浪费(用 1KB 也要占 2MB)

2. 透明大页(THP)

  • 内核自动管理、无感使用

  • 自动合并小页、内存紧张时拆回 4KB

  • 几乎不浪费内存

缺点:碎片、延迟毛刺、数据库强烈不推荐

两者之间的关系:

大页内存是技术统称

  • 静态大页 = 需要手动计算、配置。

  • 透明大页 = 自动傻瓜式动态分配。

三、场景选型:什么业务用什么?

1、必须用【静态大页】的业务(必须关闭THP)

  • Oracle / MySQL / PostgreSQL 大型数据库

  • Redis、Kafka 等内存型中间件

  • KVM 虚拟化、虚拟机宿主机

  • 金融低延迟、高频交易

  • 单机内存 ≥64G,建议上 1GB 巨型页

2、适合用【透明大页】的业务

  • Web 服务、微服务、普通小堆 Java

  • 桌面 Linux、测试环境、云弹性实例

  • 离线计算、顺序读写大内存

  • 对延迟毛刺不敏感的通用业务

⚠️红线警告

静态大页与透明大页绝对不能同时开启!

后果: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

参数介绍:

  • HugePages_Total:总页数

  • HugePages_Free:空闲页(过多 = 浪费)

  • HugePages_Rsvd:已预约(即将不足)

  • HugePages_Surp:溢出页(异常)

八、高频故障排查

故障 1:大页配置不生效,重启变回 0

只改了sysctl,没改 GRUB

无连续物理内存,内核放弃分配

故障 2:Free很多,但业务申请不到大页

内存碎片化

静态大页必须连续物理内存

故障 3:CPU 莫名高、数据库毛刺

·THP 未关闭,频繁合并拆分 → TLB Miss 暴涨

故障 4:同时开静态 + 透明大页

直接混乱、性能暴跌

必须二选一

九、总结(一张图记住)

4KB 小页:页表多、TLB 容易满、性能差

静态大页:稳、快、无抖动,适合数据库 / 缓存 / 虚拟化

透明大页:自动、省内存,适合通用业务

配置:GRUB + sysctl 双永久

红线:静态与透明绝对不同时开

大页不是玄学,是TLB 命中率的艺术。

算得准、配得对、关得干净,性能直接上一个台阶。

最新文章

随机文章