Mysql对large page的支持
[ 2010/01/25 11:16 | by selboo ]
在 Linux 操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为 4KB,因而将会产生较多 TLB Miss 和缺页中断,从而大大影响应用程序的性能。当操作系统以 2MB 甚至更大作为分页的单位时,将会大大减少 TLB Miss 和缺页中断的数量,显著提高应用程序的性能。这也正是 Linux 内核引入大页面支持的直接原因。好处是很明显的,假设应用程序需要 2MB 的内存,如果操作系统以 4KB 作为分页的单位,则需要 512 个页面,进而在 TLB 中需要 512 个表项,同时也需要 512 个页表项,操作系统需要经历至少 512 次 TLB Miss 和 512 次缺页中断才能将 2MB 应用程序空间全部映射到物理内存;然而,当操作系统采用 2MB 作为分页的基本单位时,只需要一次 TLB Miss 和一次缺页中断,就可以为 2MB 的应用程序空间建立虚实映射,并在运行过程中无需再经历 TLB Miss 和缺页中断(假设未发生 TLB 项替换和 Swap)。
为了能以最小的代价实现大页面支持,Linux 操作系统采用了基于 hugetlbfs 特殊文件系统 2M 字节大页面支持。这种采用特殊文件系统形式支持大页面的方式,使得应用程序可以根据需要灵活地选择虚存页面大小,而不会被强制使用 2MB 大页面。
在mysql中,innodb可以使用large pages来分配buffer pool跟additional memory pool.
下面来看下mysql使用large pages具体的实现方法
1:查看系统是否支持huge-pages
cat /proc/meminfo | grep -i huge
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugepagesize有值,说明系统支持large pages(如不支持,系统需要重新编译来支持)
2:配置
把配置写入到/etc/sysctl.conf 然后sysctl -p使其生效
vm.nr_hugepages=200 (大页面的页数)
vm.hugetlb_shm_group=1001(需要使用大页面的用户id 可用id mysql 来查看mysql的ID)
kernel.shmmax=536887296
#kernel.shmall=524288
3:如需使mysql使用large pages,还需设置max locked-in-memory的大小
用ulimit -a(或者ulimit -l)来查看 max locked memory (kbytes, -l) 32
vim /etc/security/limits.conf
mysql soft memlock 3145728
mysql hard memlock 3145728
或者用ulimit -l 3145728来设置,
4:vim /etc/mysql/my.cnf
添加large-pages,使得mysql 支持large-pages
5:启动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。