调整内存页的大小

原理

TLB(Translation lookaside buffer)为页表(存放虚拟地址的页地址和物理地址的页地址的映射关系)在CPU内部的高速缓存。TLB的命中率越高,页表查询性能就越好。

TLB的一行为一个页的映射关系,也就是管理了一个页大小的内存:

TLB管理的内存大小 = TLB行数 * 内存的页大小

同一个CPU的TLB行数固定,因此内存页越大,管理的内存越大,相同业务场景下的TLB命中率就越高。

修改前后可以通过如下命令观察TLB的命中率($PID为进程ID):

perf stat -p $PID -d -d -d

输出结果包含如下信息,其中1.21%和0.59%分别表示数据的miss率和指令的miss率。

1,090,788,717      dTLB-loads                #  520.592 M/sec
13,213,603      dTLB-load-misses             #    1.21% of all dTLB cache hits
669,485,765      iTLB-loads                 #  319.520 M/sec
3,979,246      iTLB-load-misses              #  0.59% of all iTLB cache hits

修改方式

设置内核内存页大小

修改Linux内核的内存页大小,需要在修改内核编译选项后重新编译内核(详情可参考内核源码编译安装),简要步骤如下所示:

设置内存大页

设置透明大页

透明大页是以上内存大页的升级版,使用透明大页,内核会自动为进程分配大页,因此无需手动保留大页。

设置/sys/kernel/mm/transparent_hugepage/enabled的值为:

参数

说明

always

在整个系统范围内启用THP,如果有进程大量使用连续的虚拟内存,则内核会尝试将大页分配给该进程。

madvise

内核仅将大页分配给madvise()系统调用指定的单个进程的内存区域。

never

禁用透明大页。

例如关闭透明大页的设置方法:

# echo never > /sys/kernel/mm/transparent_hugepage/enabled

操作系统还有很多内存参数可以调整,具体参考常用操作系统内存参数说明