技術分享 | 淺談一下大頁

愛可生雲資料庫發表於2023-02-10

作者:楊文

DBA,負責客戶專案的需求與維護,會點資料庫,不限於MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL等等。

本文來源:原創投稿

*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


1、Linux大記憶體頁特性

Linux下的大頁分為兩種型別:標準大頁(Huge Pages)和透明大頁(Transparent Huge Pages)。

大頁的產生:大多數作業系統採用了分段或分頁的方式進行管理。分段是粗粒度的管理方式,而分頁則是細粒度管理方式,分頁方式可以避免記憶體空間的浪費。相應地,也就存在記憶體的實體地址與虛擬地址的概念。透過前面這兩種方式,CPU必須把虛擬地址轉換程實體記憶體地址才能真正訪問記憶體。為了提高這個轉換效率,CPU會快取最近的虛擬記憶體地址和實體記憶體地址的對映關係,並儲存在一個由CPU維護的對映表中。為了儘量提高記憶體的訪問速度,需要在對映表中儲存儘量多的對映關係。Linux的記憶體管理採取的是分頁存取機制,為了保證實體記憶體能得到充分的利用,核心會按照LRU演演算法在適當的時候將實體記憶體中不經常使用的記憶體頁自動交換到虛擬記憶體中,而將經常使用的資訊保留到實體記憶體。通常情況下,Linux預設情況下每頁是4K,這就意味著如果實體記憶體很大,則對映表的條目將會非常多,會影響CPU的檢索效率。因為記憶體大小是固定的,為了減少對映表的條目,可採取的辦法只有增加頁的尺寸。因此Hugepage便因此而來。也就是打破傳統的小頁面的記憶體管理方式,使用大頁面2M,4M等。如此一來對映條目則明顯減少。TLB快取命中率將大大提高。

2、HugePages:

2.1、概念介紹:

1)HugePages是從Linux Kernel 2.6後被引入的。目的是使用更大的記憶體頁面(memory page size) 以適應越來越大的系統記憶體,讓作業系統可以支援現代硬體架構的大頁面容量功能。在Linux下,page size預設是4K,如果使用HugePages,預設是2M;

2)page table和TLB:

page table 對映表:實體記憶體和swap的對應關係、訪問記憶體是先讀page table、根據表裡的對映關係操作;

TLB:cpu cache元件、快取部分page table以提高轉換速度;

2.2、配置 HugePages 優缺點:

1)優點:

  • 不需要記憶體頁交換;
  • 減輕快表壓力;
  • 減輕換頁表的負載;
  • 提高記憶體的效能,降低CPU負載;

2)缺點:傳統大頁很難手動管理, 而且通常需要對程式碼進行重大更改才能有效地使用。

2.3、HugePages 使用建議:

1)如果您的系統經常碰到因為 swap 引發的效能問題,系統毫無疑問需要啟用HugePage。

2)OS記憶體非常大的系統也需要啟用HugePage。

2.4、使用 HugePages 注意事項:

如果未調整 HugePages ,可能會引發下面的問題:

  • 資料庫效能低下;
  • 出現記憶體不足或者過度使用交換空間;
  • 資料庫例項不能被啟動;
  • 關鍵性系統服務故障;

2.5、使用情況與配置檢視:

1)確認HuagePage是否配置:

cat /proc/sys/vm/nr_hugepages

2)檢視大頁的使用情況:

$ grep Huge /proc/meminfo
HugePages_Total: 150
HugePages_Free: 150
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB

2.6、HugePages配置:

1)設定 memlock(記憶體鎖):

vim /etc/security/limits.conf
在檔案最後新增資訊:
mysql soft memlock unlimited
mysql hard memlock unlimited

2)修改/etc/sysctl.conf:

vi /etc/sysctl.conf
新增/修改資訊:
kernel.shmmax = 17179869184
kernel.shmall = 4194304

3)檢視 mysql 使用者的組資訊:

id mysql

4)配置使用大頁記憶體的使用者組:

more /proc/sys/vm/hugetlb_shm_group
sysctl -w vm.hugetlb_shm_group=27

5)修改引數停止例項並重啟生效:

vi /mysql/data/3306/my.cnf
[mysqld]
large-pages

6)驗證 HugePages 配置:

cat /proc/meminfo

3、Transparent Huge Pages:

3.1、介紹:

透明大頁(Transparent Huge Pages)縮寫為THP,從RedHat 6,OEL 6,SLES 11 and UEK2 kernels 開始,系統預設會啟用Transparent HugePages,用來提高記憶體管理的效能。

3.2、Transparent Huge Pages的使用建議:

ORACLE官方不建議使用RedHat 6、OEL 6、SLES 11 and UEK2 kernels時開啟透明大頁。在 Oracle Linux 6.5、RHEL Linux 6.5+ 版中,已刪除Transparent HugePages。

3.3、Transparent Huge Pages的優點:

  • 可以使用 swap ,記憶體頁預設是2M大小,需要使用 swap 的時候,記憶體被分割為4k大小;
  • 對使用者透明,不需要使用者做特殊配置;
  • 不需要依某種庫檔案;

3.4、使用情況與配置檢視:

1)檢視透明大頁是否啟用了:

# cat /sys/kernel/mm/transparent_hugepage/enabled

2)使用情況監控:

# cd /sys/kernel/mm/transparent_hugepage/khugepaged
說明:
alloc_sleep_millisecs:多長時間整理一次碎片;
pages_collapsed 一個掃描週期被掃描的記憶體頁數;
scan_sleep_millisecs:多長時間掃描一次。

3.5、關閉透明大頁功能:

1)臨時關閉:

# echo never >> /sys/kernel/mm/transparent_hugepage/enabled
# echo never >> /sys/kernel/mm/transparent_hugepage/defrag

2)永久關閉:

在 /etc/rc.local 檔案中加入如下內容:

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

4、Huge Pages 和 Transparent Huge Pages 區別:

這兩者的區別在於大頁的分配機制,標準大頁管理是在系統啟動時預先分配的,而透明大頁管理則是動態分配的方式(在執行時由khugepaged程式動態的分配),可以實時配置,不需要重啟就能生效配置。

說明:透明大頁與傳統HugePages聯用會出現一些問題,導致效能問題和系統重啟;ORACLE強烈建議開啟HugePages需要關閉Transparent HugePages。

相關文章