一般情況下使用的記憶體為每頁4K,使用 huge page 的話預設是每頁 2M。如果設定MySQL使用 huge page 至少有兩個好處,一個是可以減少 Translation Lookaside Buffer (TLB) 失誤以提高效能,另一個是利用 huge page不會swap的特性保證MySQL的記憶體不會被交換到swap中。
MySQL 5.0.3之後在linux上支援huge page,可以使用 large-page 選項啟動MySQL。
當然還有一些相關的系統設定。
echo 400 > /proc/sys/vm/nr_hugepages
這個指定總共huge page的頁數,可以放到/etc/rc.local中。由於分配時需要有連續的記憶體空間,所以如果在運行了一段時間的系統上執行,可能無法分配到指定的數量,即使還有足夠的記憶體。
之後還需要設定核心參數kernel.shmmax和kernel.shmall,否則MySQL啟動時會報22的錯誤
InnoDB: HugeTLB: Warning: Failed to allocate 536887296 bytes. errno 22
shmmax是最大的共用記憶體段的大小,單位是位元組,預設32M,肯定是不夠的,這個應該比innodb_buffer_pool要大。shmall是共用記憶體的總大小,單位是頁,預設2097152(8G)。可以使用sysctl -w或者在/etc/sysctl.conf中設定。
除此還需要設max locked memory,使用ulimit -l或設定/etc/security/limits.conf,否則會報12的錯誤:
Warning: Failed to allocate 31457280 bytes from HugeTLB memory. errno 12
MySQL啟動之後可以使用
grep Huge /proc/meminfo
查看huge page的使用方式。
HugePages_Total: 400
HugePages_Free: 128
Hugepagesize: 2048 kB