某些硬體和作業系統架構支援大於預設值 (通常為 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
取得的Hugepagesize
值 (2MB),則結果為 128MB / 2MB,即 64 個大型頁面。我們將此值稱為P
。以系統 root 身分,在文字編輯器中開啟檔案
/etc/sysctl.conf
,並加入此處顯示的行,其中P
是上一步取得的大型頁面數量vm.nr_hugepages=P
使用先前取得的實際值,新增的行應如下所示
vm.nr_hugepages=66
儲存更新後的檔案。
以系統 root 身分,執行以下命令
$> 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