全部博文(389)
分类: Mysql/postgreSQL
2014-07-31 17:11:00
配置MySQL使用huge pages
huge-page是linux 2.6以后的内核支持特性,相比传统的内存页面大小4KB而言
huge-page提供的大小是2048k大小,通过更大的页面,减少了OS页面查找需要的时间和
开销,对于现代服务器动之上百G内存而言,性能提高不言而喻.
mysql在5.1以后的版本中就提供了对huge-page的支持,huge-page只支持存放
buffer-pool和additional-mem-pool数据,而不能存放其他类型的buffer的数据,比如
sort buffer.
首在os级别设定huge-page的大小.在rhel的版本中,每huge-page是2M大小
[root@localhost ~]# cat /proc/meminfo | grep "Hugepagesize"
Hugepagesize: 2048 kB
内核参数vm.nu_hugepages定义了huge-page的数量,在/etc/sysctl.conf中增加如下行,
vm.nr_hugepages=1000
重启或sysctl-p生效,检查huge-page的使用情况.
[root@localhost ~]# cat /proc/meminfo | grep Huge
HugePages_Total: 1000
HugePages_Free: 1000
HugePages_Rsvd: 4
Hugepagesize: 2048 kB
在/etc/security/limits.conf定义mysql用户的memlock的数量
mysql soft memlock unlimited
mysql hard memlock unlimited
设置mysql的/etc/my.cnf,增加对huge-page的支持
large_pages=1
注意innodb_buffer_pool_size+innodb_additional_mem_size一定要小于nr_hugepages*Hugepagesize(2MB)
反之,huge-page放不下,innodb在启动时会报错,转而使用传统的4KB内存分配方法,
140731 8:46:37 InnoDB: Initializing buffer pool, size = 5.7G
InnoDB: HugeTLB: Warning: Failed to allocate 6236930048 bytes. errno 12
InnoDB HugeTLB: Warning: Using conventional memory pool
140731 8:46:37 InnoDB: Completed initialization of buffer pool
实验中总共是2GB的huge-page,而我设置的innodb_buffer_pool_size是6GB。
更改innodb_buffer_pool_size为1.5GB,成功使用了huge-page
[root@localhost ~]# cat /proc/meminfo | grep Huge
HugePages_Total: 1000
HugePages_Free: 971
HugePages_Rsvd: 746
Hugepagesize: 2048 kB
mysql> show global variables like '%large_page%';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| large_page_size | 2097152 |
| large_pages | ON |
+-----------------+---------+
2 rows in set (0.00 sec)
large_page_size变量不能更改.