调整内存页的大小
原理
TLB(Translation lookaside buffer)为页表(存放虚拟地址的页地址和物理地址的页地址的映射关系)在CPU内部的高速缓存。TLB的命中率越高,页表查询性能就越好。
TLB的一行为一个页的映射关系,也就是管理了一个页大小的内存:
TLB管理的内存大小 = TLB行数 * 内存的页大小
同一个CPU的TLB行数固定,因此内存页越大,管理的内存越大,相同业务场景下的TLB命中率就越高。
 
 修改前后可以通过如下命令观察TLB的命中率($PID为进程ID):
| 1 | perf stat -p $PID -d -d -d | 
输出结果包含如下信息,其中1.21%和0.59%分别表示数据的miss率和指令的miss率。
| 1 2 3 4 | 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。1echo 20 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages 
设置透明大页
透明大页是以上内存大页的升级版,使用透明大页,内核会自动为进程分配大页,因此无需手动保留大页。
设置/sys/kernel/mm/transparent_hugepage/enabled的值为:
| 参数 | 说明 | 
|---|---|
| always | 在整个系统范围内启用THP,如果有进程大量使用连续的虚拟内存,则内核会尝试将大页分配给该进程。 | 
| madvise | 内核仅将大页分配给madvise()系统调用指定的单个进程的内存区域。 | 
| never | 禁用透明大页。 | 
例如关闭透明大页的设置方法:
| 1 | # echo never > /sys/kernel/mm/transparent_hugepage/enabled
 | 
操作系统还有很多内存参数可以调整,具体参考常用操作系统内存参数说明。
父主题: 优化方法