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内核的内存页大小,需要在修改内核编译选项后重新编译内核(详情可参考内核源码编译安装),简要步骤如下所示:
可参考kernel-parameters设置如下内核启动参数:
参数 |
说明 |
---|---|
hugepages |
定义启动时内核中配置的内存大页的数量。 |
hugepagesz |
定义启动时在内核中配置的内存大页的大小。 |
default_hugepagesz |
定义启动时在内核中配置的内存大页的默认大小。 |
设置node中2 MB大页的数量为20。
# echo 20 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
透明大页是以上内存大页的升级版,使用透明大页,内核会自动为进程分配大页,因此无需手动保留大页。
设置/sys/kernel/mm/transparent_hugepage/enabled的值为:
参数 |
说明 |
---|---|
always |
在整个系统范围内启用THP,如果有进程大量使用连续的虚拟内存,则内核会尝试将大页分配给该进程。 |
madvise |
内核仅将大页分配给madvise()系统调用指定的单个进程的内存区域。 |
never |
禁用透明大页。 |
例如关闭透明大页的设置方法:
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
操作系统还有很多内存参数可以调整,具体参考常用操作系统内存参数说明。