天天看點

技術分享 | 淺談一下大頁

作者:愛可生

作者:楊文

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。

繼續閱讀