---
title: 调整内存页的大小
description: "TLB（Translation lookaside buffer）为页表（存放虚拟地址的页地址和物理地址的页地址的映射关系）在CPU内部的高速缓存。TLB的命中率越高，页表查询性能就越好。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0015.html
sourcePath: /source/zh/perftuning/tuningtip/kunpengtuning_12_0015.html
indexId: 59161a3d5c734bc1189b3cb134ef666bb744809dae5ffad4ab2b3b73e89f4cb458
---
# 调整内存页的大小

#### 原理

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

TLB的一行为一个页的映射关系，即管理一个页大小的内存：

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

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

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

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

输出结果包含如下信息，其中1.21%为dTLB-load-misses占dTLB-loads的百分比，0.59%为iTLB-load-misses占iTLB-loads的百分比。


```
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内核的内存页大小，需要在修改内核编译选项后重新编译内核（详情可参考内核源码编译安装(https://bbs.huaweicloud.com/forum/thread-24362-1-1.html)），简要步骤如下所示：

- 执行make menuconfig
- 设置PAGESIZE大小为64KB
  Kernel Features-->Page size(64KB)

- 编译和安装内核


#### 设置内存大页

- 在内核启动阶段设置
  可参考kernel-parameters(https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html)设置如下内核启动参数：
| 参数 | 说明 |
| --- | --- |
| hugepages | 定义启动时内核中配置的内存大页的数量。 |
| hugepagesz | 定义启动时在内核中配置的内存大页的大小。 |
| default\_hugepagesz | 定义启动时在内核中配置的内存大页的默认大小。 |


- 在运行时设置node中2 MB大页的数量为20。
  1 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
```

操作系统还涉及更多的内存参数可以调整，具体参考常用操作系统内存参数说明。
