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。