以前在弄tokudb的時候,在centos 6上面,須要執行 echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled關閉Transparent Huge Pages,當時未做深究,如今從新翻出來看看。mysql
說Transparent Huge Pages以前,首先說說Huge Pages。linux
通常而言,內存管理的最小塊級單位叫作page,一個page是4096bytes,1M的內存會有256個page,1GB的話就會有256,000個page。CPU經過內置的內存管理單元維護着page表記錄。算法
正常來講,有兩種方式來增長內存能夠管理的內存大小:sql
1.增大硬件內存管理單元的大小。centos
2.增大page的大小。性能
第一個方法不是很現實,現代的硬件內存管理單元最多隻支持數百到上千的page表記錄,而且,對於數百萬page表記錄的維護算法必將與目前的數百條記錄的維護算法大不相同才能保證性能,目前的解決辦法是,若是一個程序所需內存page數量超過了內存管理單元的處理大小,操做系統會採用軟件管理的內存管理單元,但這會使程序運行的速度變慢。優化
從redhat 6(centos,sl,ol)開始,操做系統開始支持 Huge Pages,也就是大頁。spa
簡單來講, Huge Pages就是大小爲2M到1GB的內存page,主要用於管理數千兆的內存,好比1GB的page對於1TB的內存來講是相對比較合適的。操作系統
THP(Transparent Huge Pages)是一個使管理Huge Pages自動化的抽象層。進程
目前須要注意的是,因爲實現方式問題,THP會形成內存鎖影響性能,尤爲是在程序不是專門爲大內內存頁開發的時候,簡單介紹以下:
操做系統後臺有一個叫作khugepaged的進程,它會一直掃描全部進程佔用的內存,在可能的狀況下會把4kpage交換爲Huge Pages,在這個過程當中,對於操做的內存的各類分配活動都須要各類內存鎖,直接影響程序的內存訪問性能,而且,這個過程對於應用是透明的,在應用層面不可控制,對於專門爲4k page優化的程序來講,可能會形成隨機的性能降低現象。
對於mysql的意義:
mysql有兩個參數控制對於Huge Pages的使用。
large_page_size以及large_page,large_page_size沒有意義,只是用於顯示large_page佔用的大小,large_page參數用於啓用innodb的Huge Pages使用,而且支持linux的THP,能夠避免THP運行對mysql進程的影響。