天天看點

mysql啟用hugepage

1 hugepage在linux 2.6以後的核心才支援,mysql中隻有innodb引擎才支援,hugepage作用:

  • 1.減少記憶體置換
  • 2.減少TLB miss次數
  • 3.減少swap

**啟用了hugepage以後,top檢視記憶體被占用很多,但是找不到具體的程序,其實就是hugepage占用了,使用Hugepage記憶體是共享記憶體,它會一直pin在記憶體中的,不會被交換出去,也就是說使用hurgepage的記憶體不能被其他的程序使用,是以,一定要合理設定這個值,避免造成浪費。對于隻使用Oracle的伺服器來說,把Hugepage_pool設定成SGA大小即可。

2 配置:

[root@chwb13 mysql]# cat /proc/meminfo  |grep -i huge
AnonHugePages:    440320 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

在/etc/security/limits.conf定義mysql使用者的memlock的數量
mysql soft memlock unlimited
mysql hard memlock unlimited           

3.檢視mysql使用者的組資訊

id mysqluid=502(mysql) gid=501(dba) groups=501(dba)           

4.配置/etc/sysctl.conf使用大頁記憶體的使用者組

vm.hugetlb_shm_group=501
vm.nr_hugepages=10000                //定義hugepage的數量,innodb_buffer_pool_size+innodb_additional_mem_size一定要小于nr_hugepages*Hugepagesize(2MB),這個值也一定要比總記憶體小

修改my.cnf配置檔案支援hugepage:
large_pages=1
重新開機mysql後檢視:
mysql> show global variables like '%large_page%';           

5 驗證hugepage是否生效:

[root@localhost ~]# cat /proc/meminfo | grep Huge
HugePages_Total:  1000
HugePages_Free:    971
HugePages_Rsvd:    746
Hugepagesize:     2048 kB

HugePages_Free小于HugePages_Total,一切正常           

報錯:啟動mysql。

在啟動mysql的時候,最容易報的錯誤是:

InnoDB: HugeTLB: Warning: Failed to allocate 138412032 bytes. errno 12
InnoDB HugeTLB: Warning: Using conventional memory pool


這是由于上面配置的兩點所緻。
1)nr_hugepages 的值*2M應大于(innodb_buffer_pool_size+innodb_additional_mem_pool_size)因為以上談到 innodb可以使用large pages來配置設定buffer pool跟additional memory pool.
2)memlock 的設定,在啟動mysql時,一定要先檢視用ulimit -a 來檢視max locked memory 設定是否合理,可以嘗試用以上兩種方法來設定該值。還有一點,/etc/security/limits.conf配置檔案的修改,可能無法通過ssh來 檢視,故也不能用ssh來啟動mysql。