全部產品
Search
文件中心

Alibaba Cloud Linux:Alibaba Cloud Linux系統中與透明大頁THP相關的效能調優方法

更新時間:Jul 17, 2024

透明大頁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效能調試文檔