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
高性能内存库
方法一:使用tcmalloc(推荐使用该方式,安装较为方便)
- openEuler
yum install gperftools
- Ubuntu
apt update apt install libgoogle-perftools4 libgoogle-perf
如果无法使用上述方法下载,可以通过以下步骤使用源码进行安装(源码安装依赖libunwind)。
- 获取软件包,进行安装。
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.16/gperftools-2.16.tar.gz --no-check-certificate tar -xf gperftools-2.16.tar.gz && cd gperftools-2.16 ./configure --prefix=/usr/local/lib --with-tcmalloc-pagesize=64 make make install
- 确认tcmalloc动态库的文件位置。
find /usr -name libtcmalloc.so*
- 使用方法(仅在当前指令使用),/usr/lib64/libtcmalloc.so为上一步查询获得的实际路径。
LD_PRELOAD=`/usr/lib64/libtcmalloc.so` python3 app.py
方法二:使用jemalloc
- 从GitHub上获取jemalloc源码。
git clone https://github.com/jemalloc/jemalloc.git
- 进入目录,执行以下命令。
(如果出现缺失autoconf等依赖的错误,请使用自行安装相应依赖)
./autogen.sh make make install
- 将jemalloc添加到PATH,<path>为jemalloc实际路径。
export PATH="<path>/bin:${PATH}"
- 使用方法(仅在当前指令使用)。
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 thatdataloader's workers are out of shared memory. Please try to raise your sharedmemory 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