Alibaba Cloud Linux系统中与透明大页THP相关的性能调优方法

透明大页THP(Transparent Huge Pages)是Linux内核中的一个通用特性,它可以自动将小页面(通常为4 KB)合并成大页面(通常为2 MB或更大),可以减少内存访问页表项PTE(Page Table Entries)大小和访问次数,同时减轻了转译后备缓冲器TLB(Translation Lookaside Buffer)缓存的压力,提高内存访问的效率。本文主要介绍在Alibaba Cloud Linux系统中如何通过透明大页THP功能来提升系统的性能。

THP相关配置说明

在Alibaba Cloud Linux 2的4.19.81-17.2及更早的内核版本中,透明大页THP默认配置为madvise,即限定开启透明大页THP的功能。这一设置与其他主流操作系统不一致,例如Red Hat Enterprise Linux 7、CentOS 7、Amazon Linux 2等。为尽量保证与主流操作系统默认场景的兼容性,从Alibaba Cloud Linux 2的4.19.91-18内核版本开始,透明大页THP默认配置为always,即系统全局开启THP功能。

全局配置

在Alibaba Cloud Linux内核中,透明大页THP的配置文件位于/sys/kernel/mm/transparent_hugepage/enabled,可选的配置项如下:

  • always

    系统全局开启透明大页THP功能。

  • never

    系统全局关闭透明大页THP功能。

  • madvise

    仅在通过madvise()系统调用,并且设置了MADV_HUGEPAGE标记的内存区域中开启透明大页THP功能。

    说明

    应用程序使用 MADV_HUGEPAGE 标记时,内核就会知道应用程序希望使用大页进行内存分配。

碎片整理配置

除了上述全局配置外,还有下列两个与透明大页THP相关的碎片整理配置。

  • 透明大页THP碎片整理:透明大页的碎片整理可以合并系统中分散的小页面,以创建更大的页面,以减少内存碎片化并提高性能。

  • khugepaged碎片整理:khugepaged是一个内核线程,主要负责管理和整理大页,以减少内存碎片化并提高性能。它会监视系统中的大页面,当发现分散的大页时,会尝试将它们合并成更大的页,以提高内存利用率和性能。

khugepaged碎片整理主要关注管理和整理已经存在的大页面,而透明大页THP的碎片整理是指系统尝试合并分散的小页面以创建更大的页面。两者都旨在减少内存碎片化,并通过合并页面来提高内存利用率和性能。二者详细说明如下:

透明大页THP碎片整理

发生缺页异常(Page Fault)时,该功能可控制内存分别进行直接回收(Direct Reclaim)、后台回收(Background Reclaim)、直接整理(Direct Compaction)、后台整理(Background Compaction)的行为。开启或关闭该功能的配置文件路径为/sys/kernel/mm/transparent_hugepage/defrag,可选的配置项如下:

  • always

    当系统分配不出透明大页时,暂停内存分配行为,总是等待系统进行内存的直接回收和内存的直接整理。内存回收和整理结束后,如果存在足够的连续空闲内存,则继续分配透明大页。

  • defer

    当系统分配不出透明大页时,转为分配普通的4 KB页。同时唤醒kswapd内核守护进程以进行内存的后台回收,唤醒kcompactd内核守护进程以进行内存的后台整理。一段时间后,如果存在足够的连续空闲内存,khugepaged内核守护进程将此前分配的4 KB页合并为2 MB的透明大页。

  • madvise

    仅在通过madvise()系统调用,并且设置了MADV_HUGEPAGE标记的内存区域中,内存分配行为等同于always。其余部分的内存分配行为保持为:发生缺页异常时,转为分配普通的4 KB页。

    说明

    在Alibaba Cloud Linux 2的4.19.81-17.2及之后的内核版本中,系统默认设置为madvise

  • defer+madvise

    仅在通过madvise()系统调用,并且设置了MADV_HUGEPAGE标记的内存区域中,内存分配行为等同于always。其余部分的内存分配行为保持为defer

  • never

    禁止碎片整理。

khugepaged碎片整理

与khugepaged碎片整理功能相关的重要配置如下:

  • 功能开关

    功能开关的配置文件路径为/sys/kernel/mm/transparent_hugepage/khugepaged/defrag。可选的配置项如下:

    • 0

      关闭khugepaged碎片整理功能。

    • 1

      配置为1时,khugepaged内核守护进程会在系统空闲时周期性唤醒,尝试将连续的4 KB页合并成2 MB的透明大页。

      说明
      • 在Alibaba Cloud Linux 2的4.19.91-18及之后的内核版本中,系统默认设置为1

      • 由于该操作会在内存路径中加锁,并且khugepaged内核守护进程可能会在错误的时间启动扫描和转换大页,因此存在影响应用性能的可能性。

  • 重试间隔

    重试间隔是指当透明大页THP分配失败时,khugepaged内核守护进程进行下一次大页分配前需要等待的时间,来避免短时间内连续发生大页分配失败。默认值为60000,单位为毫秒,即默认等待60秒。配置文件路径为/sys/kernel/mm/transparent_hugepage/khugepaged/alloc_sleep_millisecs

  • 唤醒间隔

    唤醒间隔是指khugepaged内核守护进程每次唤醒的时间间隔。默认值为10000,单位为毫秒,即默认每10秒唤醒一次。配置文件路径为/sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs

  • 扫描页数

    扫描页数是指khugepaged内核守护进程每次唤醒后扫描的页数。默认值为4096个页。配置文件路径为/sys/kernel/mm/transparent_hugepage/khugepaged/pages_to_scan

THP配置建议

使用THP的影响

透明大页THP能增加转译后备缓冲器TLB命中的几率,减少内存访问页表项PTE时的开销,使系统获得性能提升。透明大页THP试图进一步释放运维压力,不需要应用程序进行特殊修改或配置,使用户在无感知的情况下享受到性能的提升。然而,透明大页THP的资源是有限的,当系统达到透明大页THP分配的瓶颈时,需要使用一系列机制来保证系统的正常运行。在这种情况下,系统的默认配置不一定适用于所有用户场景。而且默认配置对于许多应用来说可能造成系统性能下降,例如:

  • 如果透明大页THP的碎片整理开关设置为always,内存紧张时会和普通4 KB页一样,出现内存的直接回收或内存的直接整理,这两个操作均是同步等待的操作,会造成系统性能下降。

  • 如果khugepaged碎片整理的开关设置为1,在khugepaged内核守护进程进行内存合并操作时,会在内存路径中加锁。如果khugepaged碎片整理在错误的时间被触发,会对内存敏感型应用造成性能影响。

  • 如果保持开启透明大页THP,同时关闭上述两个碎片整理的开关,则内存分配过程相较于4 KB页可能会更快地消耗完空闲页资源,然后系统开始进入内存回收和内存整理的过程,反而更早的出现系统性能下降。

配置建议

综上所述,透明大页THP对系统性能的影响,不能一概而论。需要根据业务、系统、应用的实际情况进行调整,下面列举常见的示例场景供您参考:

重要

请您在修改任何配置文件之前,备份相关配置文件或者创建云盘快照备份数据,避免数据丢失。

  • 如果您对系统内核有足够信心,建议您参考下列命令,开启试验性开关(defer+madvise),使内核的内存后台回收(kswapd内核守护进程)、内存的后台整理(kcompactd内核守护进程)与khugepaged内核守护进程尽可能协同工作,在内存整理和性能平稳之间找到平衡点。

    sudo bash -c "echo 'defer+madvise' > /sys/kernel/mm/transparent_hugepage/defrag"
  • 如果您发现系统中的khugepaged内核守护进程达到或接近100%的CPU使用率时,可以考虑增加khugepaged内核守护进程唤醒的间隔时间,比如修改为30秒,示例命令如下。

    sudo sh -c 'echo 30000 > /sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs'

    或者直接关闭khugepaged内核守护进程,示例命令如下。

    sudo sh -c 'echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag'
  • 在特殊场景下,例如,数据库应用有大量访问请求的场景、大量延迟敏感型应用场景或大量短生命周期的内存分配(Short-lived Allocation)场景,如果系统的稳定性比性能更重要,建议关闭透明大页THP功能。在系统运行时关闭透明大页THP的示例命令如下。

    sudo sh -c 'echo "never" > /sys/kernel/mm/transparent_hugepage/enabled'
    说明

    该命令仅在本次系统运行期间有效,系统重启后透明大页THP功能仍会开启。如果需要持久关闭透明大页THP功能,需以root用户依次执行下列命令,在内核启动参数中添加关闭透明大页THP功能的参数。

    sudo grubby --args="transparent_hugepage=never" --update-kernel="/boot/vmlinuz-$(uname -r)"
    sudo reboot

查看THP的使用情况

在系统中查看透明大页THP的使用情况主要分为系统级别和进程级别,具体说明如下:

  • 系统级别

    在系统级别上,透明大页的相关参数和配置选项可以影响整个系统中的所有进程。在系统中执行下列示例命令,查看透明大页THP的使用情况。

    cat /proc/meminfo | grep AnonHugePages

    系统显示的示例如下。

    AnonHugePages:    614400 kB
    说明

    如果系统返回非零值,则说明系统中使用了一定数量的透明大页THP。

  • 进程级别:在进程级别,可以使用madvise()系统调用以及MADV_HUGEPAGE标记来控制透明大页的使用。这种方式允许应用程序有选择地使用透明大页功能,而不会影响其他进程或整个系统。在系统中执行下列示例命令,查看某个进程使用的透明大页THP。

    sudo cat /proc/<PID>/smaps | grep AnonHugePages
    说明

    <PID>需替换为实际的进程的PID。

    系统显示的示例如下。

    AnonHugePages:         0 kB
    AnonHugePages:         0 kB
    AnonHugePages:         0 kB
    AnonHugePages:         0 kB
    AnonHugePages:         0 kB
    AnonHugePages:         0 kB
    AnonHugePages:         0 kB
    AnonHugePages:         0 kB
    AnonHugePages:         0 kB
    AnonHugePages:         0 kB

相关文档

  • 您可以通过透明大页THP的介绍了解更多关于透明大页THP的功能说明和风险。

  • 代码大页是一种基于透明大页THP相同的整合机制,将连续的代码片段映射到大页(通常是2 MB或更大)的内存区域的机制,可以减少TLB缺失的概率。您也可以通过Alibaba Cloud Linux提供的代码大页功能来提升系统的性能。更多信息,请参见代码大页

  • Red Hat Enterprise Linux 7通过透明大页THP性能调优的方法,请参见RHEL 7性能调试文档