# 透明大页内存技术

透明大页面（THP，transparent huge page）将为性能自动优化系统设置。通过允许所有的空余内存被用作缓存以提高性能。

一旦 `/sys/kernel/mm/transparent_hugepage/enabled` 被设置为 `always` ，透明大页面将被默认使用。运行以下命令禁用透明大页面：

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

透明大页面支持不能阻止 hugetlbfs 的使用。但在 hugetlbfs 未使用时，KVM 将使用透明大页面来替代常规的 4KB 页面大小。

### 静态大页面配置

在某些情况下，更优的选择是增加对大页面的控制。在客机中使用静态大页面，使用 virsh edit 向客机 XML 配置添加以下命令：

```markup
<memoryBacking>
        <hugepages/>
</memoryBacking>
```

以上命令使主机使用大页面向客机分配内存，以替代使用默认的页面大小。

* 查看当前的大页面值，请运行以下命令

```
cat /proc/sys/vm/nr_hugepages
```

例如，输出：

```
118784
```

> 这里输出的当前大页值就是`/proc/meminfo`中的 `HugePages_Totaol`

* 查看当前的大页面值：

```
cat /proc/meminfo | grep Huge
```

可以看到输出类似：

```
AnonHugePages:    526336 kB
HugePages_Total:   118784
HugePages_Free:    16126
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
```

* 大页面将以 2MB 为增量进行设置。将大页面的数量设置到 25,000，请运行以下命令：

```
echo 25000 > /proc/sys/vm/nr_hugepages
```

如果要进行永久设置，则使用以下命令将

```
sysctl -w vm.nr_hugepages=N
```

可以在 `/etc/sysctl.d/` 目录下创建一个 `nr_hugepages.conf` 配置文件：

```
vm.nr_hugepages=25000
```

然后执行 `sysctl -p`刷新使之生效。

* 挂载大页面：

```
mount -t hugetlbfs hugetlbfs /dev/hugepages
```

* 重启`libvirtd`之后，再运行以下命令启动虚拟机

```
# systemctl start libvirtd

# virsh start virtual_machine
```

* 验证 `/proc/meminfo` 中对修改：

```
# cat /proc/meminfo | grep Huge
AnonHugePages:         0 kB
HugePages_Total:   25000
HugePages_Free:    23425
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
```

## 参考

* [Transparent Hugepage Support](https://www.kernel.org/doc/Documentation/vm/transhuge.txt)
* [How to use, monitor, and disable transparent hugepages in Red Hat Enterprise Linux 6 and 7? ](https://access.redhat.com/solutions/46111)
* [透明大页面配置](https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/virtualization_tuning_and_optimization_guide/sect-virtualization_tuning_optimization_guide-memory-tuning#sect-Virtualization_Tuning_Optimization_Guide-Memory-Huge_Pages)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://huataihuang.gitbook.io/cloud-atlas-draft/virtual/kvm/performance/transparent_hugepage.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
