鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

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)。

  1. 获取软件包,进行安装。
    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
  2. 确认tcmalloc动态库的文件位置。
    find /usr -name libtcmalloc.so*
  3. 使用方法(仅在当前指令使用),/usr/lib64/libtcmalloc.so为上一步查询获得的实际路径。
    LD_PRELOAD=`/usr/lib64/libtcmalloc.so` python3 app.py

方法二:使用jemalloc

  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 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