在 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。