某些硬體和作業系統架構支援大於預設值(通常為 4KB)的記憶體頁面。此支援的實際實作取決於底層硬體和作業系統。執行大量記憶體存取的應用程式可能會因為減少轉譯後備緩衝區 (TLB) 錯失而透過使用大型頁面來獲得效能提升。
在 MySQL 中,InnoDB
可以使用大型頁面來為其緩衝池和額外記憶體池配置記憶體。
在 MySQL 中標準使用大型頁面會嘗試使用最大支援的大小,最高可達 4MB。在 Solaris 下,「超大型頁面」功能可啟用最高達 256MB 的頁面。此功能適用於最近的 SPARC 平台。可以使用 --super-large-pages
或 --skip-super-large-pages
選項來啟用或停用此功能。
MySQL 也支援 Linux 對大型頁面支援的實作(在 Linux 中稱為 HugeTLB)。
在 Linux 上可以使用大型頁面之前,必須啟用核心來支援它們,並且必須配置 HugeTLB 記憶體池。作為參考,HugeTBL API 記載於 Linux 原始碼的 Documentation/vm/hugetlbpage.txt
檔案中。
某些最近的系統(例如 Red Hat Enterprise Linux)的核心可能預設已啟用大型頁面功能。若要檢查您的核心是否為真,請使用以下命令並尋找包含 「huge」的輸出列
$> grep -i huge /proc/meminfo
AnonHugePages: 2658304 kB
ShmemHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
非空命令輸出表示存在大型頁面支援,但零值表示沒有配置頁面供使用。
如果您的核心需要重新配置以支援大型頁面,請查閱 hugetlbpage.txt
檔案以取得指示。
假設您的 Linux 核心已啟用大型頁面支援,請使用以下步驟配置它以供 MySQL 使用
判斷需要的大型頁面數量。這是 InnoDB 緩衝池的大小除以大型頁面大小,我們可以計算為
innodb_buffer_pool_size
/Hugepagesize
。假設innodb_buffer_pool_size
(128MB) 的預設值,並使用從/proc/meminfo
(2MB) 取得的Hugepagesize
值,則為 128MB / 2MB,或 64 個大型頁面。我們將此值稱為P
。以系統根使用者身分,在文字編輯器中開啟
/etc/sysctl.conf
檔案,並新增此處顯示的行,其中P
是在上一個步驟中取得的大型頁面數量vm.nr_hugepages=P
使用先前取得的實際值,新增的行應如下所示
vm.nr_hugepages=66
儲存更新的檔案。
以系統根使用者身分,執行以下命令
$> sudo sysctl -p
注意在某些系統上,大型頁面檔案的名稱可能會略有不同;例如,某些發行版將其稱為
nr_hugepages
。如果 sysctl 傳回與檔案名稱相關的錯誤,請檢查/proc/sys/vm
中對應檔案的名稱,並改用該名稱。若要驗證大型頁面設定,請如先前所述再次檢查
/proc/meminfo
。現在您應該會在輸出中看到一些額外的非零值,類似於以下所示:$> grep -i huge /proc/meminfo AnonHugePages: 2686976 kB ShmemHugePages: 0 kB HugePages_Total: 233 HugePages_Free: 233 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 477184 kB
您也可以選擇壓縮 Linux VM。您可以使用一系列命令來完成此操作,可能在腳本檔案中,類似於此處顯示的內容:
sync sync sync echo 3 > /proc/sys/vm/drop_caches echo 1 > /proc/sys/vm/compact_memory
請參閱您的作業系統平台文件,以取得有關如何執行此操作的更多資訊。
檢查伺服器使用的任何組態檔案,例如
my.cnf
,並確保innodb_buffer_pool_chunk_size
設定為大於巨型頁面大小。此變數的預設值為 128M。MySQL 伺服器中的大型頁面支援預設為停用。若要啟用它,請使用
--large-pages
啟動伺服器。您也可以將以下這行新增至伺服器my.cnf
檔案的[mysqld]
區段來達成:large-pages=ON
啟用此選項後,
InnoDB
會自動將大型頁面用於其緩衝池和其他記憶體池。如果InnoDB
無法執行此操作,它會退回使用傳統記憶體,並在錯誤日誌中寫入警告:警告:使用傳統記憶體池。
您可以透過在重新啟動 mysqld 後再次檢查 /proc/meminfo
來驗證 MySQL 現在是否正在使用大型頁面,如下所示:
$> grep -i huge /proc/meminfo
AnonHugePages: 2516992 kB
ShmemHugePages: 0 kB
HugePages_Total: 233
HugePages_Free: 222
HugePages_Rsvd: 55
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 477184 kB