调整内存页的大小
原理
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
修改方式
- 调整内核内存页大小
- 设置内存大页
- 设置透明大页
设置内核内存页大小
设置内存大页
- 在内核启动阶段设置
可参考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
操作系统还有很多内存参数可以调整,具体参考常用操作系统内存参数说明。
父主题: 优化方法