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

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

更新时间:2020-08-28 09:40:32

免责声明: 本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

概述

本文主要介绍在Alibaba Cloud Linux 2系统中,与透明大页THP(Transparent Huge Pages)相关的性能调优方法。关于透明大页THP的概念,请参见更多信息

详细信息

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

用户告知

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

功能开关

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

  • always
    系统全局开启透明大页THP功能。
    注意:在Alibaba Cloud Linux 2 4.19.91-18及之后的内核版本中,系统默认设置为always
  • never
    系统全局关闭透明大页THP功能。
  • madvise
    仅在通过madvise()系统调用,并且设置了MADV_HUGEPAGE标记的内存区域中开启透明大页THP功能。

碎片整理配置

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

透明大页THP碎片整理

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

  • always
    当系统分配不出透明大页时,暂停内存分配行为,总是等待系统进行内存的直接回收和内存的直接整理。内存回收和整理结束后,如果存在足够的连续空闲内存,则继续分配透明大页。
  • defer
    当系统分配不出透明大页时,转为分配普通的4KB页。同时唤醒kswapd内核守护进程以进行内存的后台回收,唤醒kcompactd内核守护进程以进行内存的后台整理。一段时间后,如果存在足够的连续空闲内存,khugepaged内核守护进程将此前分配的4KB页合并为2MB的透明大页。
  • madvise
    仅在通过madvise()系统调用,并且设置了MADV_HUGEPAGE标记的内存区域中,内存分配行为等同于always。其余部分的内存分配行为保持为:发生缺页异常时,转为分配普通的4 KB页。
    注意:在Alibaba Cloud Linux 2 4.19.91-18及之后的内核版本中,系统默认设置为madvise
  • defer+madvise
    仅在通过madvise()系统调用,并且设置了MADV_HUGEPAGE标记的内存区域中,内存分配行为等同于always。其余部分的内存分配行为保持为defer
  • never
    禁止碎片整理。

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能增加转译后备缓冲器TLB(Translation Lookaside Buffer)命中的几率,减少内存访问页表项PTE(Page Table Entries)时的开销,使系统获得性能提升。透明大页THP试图进一步释放运维压力,使用户在无感知的情况下享受到性能的提升。然而,透明大页THP的资源是有限的,当系统达到透明大页THP分配的瓶颈时,需要使用一系列机制来保证系统的正常运行。在这种情况下,系统的默认配置不一定适用于所有用户场景。

透明大页THP的利弊在业内早有讨论,至今业内的普遍观点依然认为:在系统运维人员不够了解透明大页THP的前提下,使用系统的默认配置对于许多应用来说是存在风险的。主要的风险可能有:

  • 如果透明大页THP的碎片整理开关设置为always,内存紧张时会和普通4 KB页一样,出现内存的直接回收或内存的直接整理,这两个操作均是同步等待的操作,会造成系统性能下降。
  • 如果khugepaged碎片整理的开关设置为1,在khugepaged内核守护进程进行内存合并操作时,会在内存路径中加锁。如果khugepaged碎片整理在错误的时间被触发,会对内存敏感型应用造成性能影响。
  • 如果保持开启透明大页THP,同时关闭上述两个碎片整理的开关,则内存分配过程相较于4 KB页可能会更快地消耗完空闲页资源,然后系统开始进入内存回收和内存整理的过程,反而更早的出现系统性能下降。

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

注意:请您在修改任何配置文件之前,备份相关配置文件或者创建ECS快照,确保数据安全。

  • 如果您对系统内核有足够信心,建议您参考下列命令,开启试验性开关(defer+madvise),使内核的内存后台回收(kswapd内核守护进程)、内存的后台整理(kcompactd内核守护进程)与khugepaged内核守护进程尽可能协同工作,在内存整理和性能平稳之间找到平衡点。
    echo 'defer+madvise' > /sys/kernel/mm/transparent_hugepage/defrag
  • 如果您发现系统中的khugepaged内核守护进程达到或接近100%的CPU使用率时,可以考虑增加khugepaged内核守护进程唤醒的间隔时间,比如修改为30秒,示例命令如下。
    echo 30000 > /sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs
    或者直接关闭khugepaged内核守护进程,示例命令如下。
    echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
  • 在特殊场景下,例如,数据库应用有大量访问请求的场景、大量延迟敏感型应用场景或大量短生命周期的内存分配(Short-lived Allocation)场景,如果系统的稳定性比性能更重要,建议关闭透明大页THP功能。在系统运行时关闭透明大页THP的示例命令如下。
    echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
    注意:该命令仅在本次系统运行期间有效,系统重启后透明大页THP功能仍会开启。如果需要持久关闭透明大页THP功能,请参见更多信息

查看透明大页THP的使用情况

透明大页THP的使用情况主要分为两个层面,分别如下:

  • 系统级别
    在系统中执行下列示例命令,查看透明大页THP的使用情况。
    cat /proc/meminfo | grep AnonHugePages
    系统显示的示例如下。
    AnonHugePages:    614400 kB
    说明:如果系统返回非零值,则说明系统中使用了一定数量的透明大页THP。
  • 进程级别
    在系统中执行下列示例命令,查看某个进程使用的透明大页THP。
    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可以使内核为用户进程自动分配大页(Huge Pages),而无需像HugeTLB一样预先保留一定数量的大页。此功能在一定程度上使用户的应用程序性能得以提升,然而在实际生产中,如果该选项设置不当,反而可能造成应用程序的性能波动。

持久关闭THP功能

以root用户依次执行下列命令,在内核启动参数中添加关闭透明大页THP功能的参数。

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

相关文档

请参考下列文档了解更多关于透明大页THP的功能说明和风险。

适用于

  • 云服务器ECS