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