---
title: OS性能优化
description: "适用于需要频繁进行内存操作，存在较多TLB Miss和缺页中断的场景。主要优化手段包括：使用大页内存池、引入高性能内存分配库、malloc分配时使用大页、Glibc动态库使用大页（仅在特定系统支持）。一般来说，在优化中通常不建议叠加使用多种优化方式，以避免引入额外复杂性和潜在冲突。若运行环境为openEuler 22.03 LTS SP4操作系统，可考虑叠加使用Glibc动态库的大页特性，以进一步提升性能。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengai/tuningguide/imog_a800ia2/kunpengai_800i_05_0009.html
sourcePath: /source/zh/kunpengai/tuningguide/imog_a800ia2/kunpengai_800i_05_0009.html
indexId: f4a5f50b43c8b40f40ca23cd97604f442af7f9400c359eb0e80cc167e1a9470173
---
# OS性能优化

适用于需要频繁进行内存操作，存在较多TLB Miss和缺页中断的场景。主要优化手段包括：使用大页内存池、引入高性能内存分配库、malloc分配时使用大页、Glibc动态库使用大页（仅在特定系统支持）。一般来说，在优化中通常不建议叠加使用多种优化方式，以避免引入额外复杂性和潜在冲突。若运行环境为openEuler 22.03 LTS SP4操作系统，可考虑叠加使用Glibc动态库的大页特性，以进一步提升性能。

#### 使用大页内存池

在Linux操作系统上运行内存需求量较大的应用程序时，由于其采用的默认页面大小为4KB，因而将会产生较多TLB Miss和缺页中断，从而大大影响应用程序的性能。当操作系统使用大页内存时，将会大大减少TLB Miss和缺页中断的数量，显著提高应用程序的性能。

大页内存分为两种，一种是标准大页，适合需要高性能和细粒度控制的应用程序，适用于对内存管理和性能有严格要求的场景。另一种是透明大页，适合希望简化配置并自动优化内存使用的应用程序，尤其适用于大多数通用场景，可根据需要来选择开启哪种大页。

- 标准大页
  临时启用标准大页内存池

  推荐采用此方法，不需要重启机器：

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


  使用下述命令可以检查是否成功启用。

```
cat /proc/meminfo | grep -i huge
```


  如图所示，即为成功启用后的效果。

  “vm.nr_hugepages”的值即为2M标准大页的数量，申请标准大页会导致OS内存相应减少，建议按需设置对应大小。

- 透明大页
  执行以下指令。

```
cat /sys/kernel/mm/transparent_hugepage/enabled
```


  确认透明大页是否启动，若回显结果为[always]则表明已开启透明大页。一般透明大页默认开启。

  如果未开启，则使用以下命令开启大页。

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


#### 高性能内存库

1. 从GitHub上获取jemalloc源码。

```
git clone https://github.com/jemalloc/jemalloc.git
```


2. 进入目录，执行以下命令（如果出现缺失autoconf等依赖的错误，请使用自行安装相应依赖）。

```
./autogen.sh
make
make install
```


3. 将jemalloc添加到PATH，<path>为jemalloc实际路径。

```
export PATH="<path>/bin:${PATH}"
```


4. 使用方法（仅在当前指令使用）。

```
LD_PRELOAD=`jemalloc-config --libdir`/libjemalloc.so.`jemalloc-config --revision` python3 app.py
```


#### malloc使用大页

要求：Glibc版本大于等于2.34。


输入下列选项中的一个以启用大页，其中1表示Glibc的malloc函数会使用透明大页，2表示Glibc的malloc函数会使用标准大页。

- 使用透明大页

```
export GLIBC_TUNABLES=glibc.malloc.hugetlb=1
```


- 使用标准大页

```
export GLIBC_TUNABLES=glibc.malloc.hugetlb=2
```


如果训练模型场景下，使用标准大页出现报错“ Bus error. It is possible that dataloader's workers are out of shared memory. Please try to raise your shared memory limit.”，可以尝试使用透明大页规避这个问题。


#### Glibc动态库使用大页

openEuler提供的Glibc加载动态库方案默认映射大页则可以减少内存开销，同时加快进程启动速度，最终能达到降低iTLB cache miss以提升性能的结果。首先确认Glibc和Glibc-devel是否安装，版本是否满足要求。

要求：需要openEuler sp4 update 2.34-161版本以上的Glibc（依赖于openEuler 22.03 LTS SP4系统）。

使用LD_HUGEPAGE_LIB环境变量，会让可执行程序依赖的所有动态库都尝试映射大页。变量值为动态库的大页模式：

- 配置为2，使用动态库大页模式（支持透明大页）
- 配置为1，使用动态库大页模式（支持标准大页）。
- 配置为0，动态库不使用大页。

该环境变量不会被复制到子进程，建议在运行程序入口配置，在外部shell脚本（非程序入口）设置不会生效。

使用方法示例：

```
export LD_HUGEPAGE_LIB=1
torchrun --nnodes=1 --nproc_per_node=8 --master-port 61888 scripts/train.py \
configs/opensora-v1-1/train/stage1.py
```
