Linux 以 页(page)为单位管理内存,默认内存页面的大小为 4KB。但当程序运行内存(RAM)需求量较大时,默认 4KB 大小的页面会导致较多的 TLB miss 和缺页中断,从而大大影响应用程序性能。Hugepage(大页内存) 应运而生。
说明
不同操作系统对 Hugepage 表述不同:
- Linux : HugePages
- BSD : SuperPages
- Windows : LargePages
一些术语:
- Page Table(页表)是一种内存管理的实现方式,用于- 物理地址到- 逻辑地址之间的映射。对于内存的访问,先是访问- Page Table,然后根据- Page Table中的映射关系,隐式的转移到- 物理地址来存取数据
- TLB(Translation Lookaside Buffer)是虚拟地址到物理地址转换cache,包含了部分- Page Table的映射关系,用于快速实现虚拟地址到物理地址的转换
- hugetlb 是 TLB 中指向 HugePage 的一个入口
信息
$ cat /proc/meminfo | grep -i Hugepage
AnonHugePages:     59392 kB
HugePages_Total:       4  # 预留 HugePages 的总个数
HugePages_Free:        4  # 尚未分配的 HugePages 数量 = HugePages_Total - HugePages_Rsvd
HugePages_Rsvd:        0  # HugePages 剩余数量
HugePages_Surp:        0
Hugepagesize:       2048 kB
hugepage 策略
$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
配置
永久配置
修改 /etc/default/grub,在字段 GRUB_CMDLINE_LINUX 后添加:
GRUB_CMDLINE_LINUX="... default_hugepagesz=1G hugepagesz=1G hugepages=16"
grub2-mkconfig -o /boot/grub2/grub.cfg
# or
grub-mkconfig -o /boot/grub/grub.cfg
reboot
说明
- /etc/sysctl.d/hugepages.conf也可以控制 hugepage 的配置
- /proc/cmdline可以查看启动时的配置
临时配置
2048kB指预留2M的大小为512个
echo 512 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
echo 512 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 512 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages