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