||
关于大页可以参考我上一篇博客
在MySQL中启用大页(Huge Pages)可以提高性能,还可以减少内存的使用。大页能够减少操作系统的页表,由此可减轻CPU负担和内存空间,从而减少了内存管理开销。在MySQL中,InnoDB可以使用大页面为其缓冲池和额外的内存池分配内存。
1.首先要在my.cnf配置文件,开启大页支持
[mysqld]
large-pages=ON
2.确保innodb_buffer_pool_chunk_size设置为大于Hugepagesize。默认值为128M。
3.保证操作系统大页缓存数量。InnoDB缓冲池的大小除以大页面大小(InnoDB_buffer_pool_size/Hugepagesize)。如:innodb_buffer_pool_size的默认值(128MB),并使用从/proc/meminfo(2MB)获得的Hugepagesize值,这是128MB/2MB=64,即确定所需的大页数64(称这个值为P)。
需要在操作系统/etc/sysctl.conf,并添加此处显示的行,其中P是在上一步中获得的大页面数:
#添加大页数量
shell> vim /etc/sysctl.conf
vm.nr_huge_pages=64
#载入sysctl配置文件
shell> sysctl -p
备注:nr_hugepages:表示池中大于HugePages数量。剩余HugePages的最大数量由nr_overcommit_hugepages 控制。
到此MySQL大页配置完成。
在MySQL使用场景中,是否需要开启HugePages配置。大页虽然有优点,但又可能带来不确定的缺点。如:软件本身也对这方面的支持,虚拟化的融入,更难控制大页的处理。因此需要对使用大页的应用,进行压测,来判断是否受益于页。
可以是使用perf进行大页统计和分析:
#每秒钟输出一次dTLB读取大页情况CTRL-C退出
shell> perf stat -e dTLB-loads,dTLB-load-misses,dTLB-stores,dTLB-store-misses -a -I 1000
# time counts unit events
1.001030174 1,404,619,363 dTLB-loads [100.00%]
1.001030174 8,371,328 dTLB-load-misses [100.00%]
1.001030174 8,172,342 dTLB-stores [100.00%]
1.001030174 624,246 dTLB-store-misses
# 查看指定进程的dTLB读取大页情况
shell> perf stat -e dTLB-loads,dTLB-load-misses,dTLB-stores,dTLB-store-misses -a -p 248777
Performance counter stats for process id '248777':
1,579,026,997 dTLB-loads
8,628,213 dTLB-load-misses # 0.55% of all dTLB cache hits
773,612,816 dTLB-stores
681,404 dTLB-store-misses
7.571849344 seconds time elapsed
# 每秒钟输出一次iTLB未命中率情况
shell> perf stat -e iTLB-load,iTLB-load-misses -a -I 1000
# time counts unit events
1.000715912 624,176,335 iTLB-load [100.00%]
1.000715912 8,200,197 iTLB-load-misses
# 查看指定进程的iTLB情况
shell> perf stat -e iTLB-load,iTLB-load-misses -a -p 248777
Performance counter stats for process id '248777':
1,609,612,422 iTLB-load [100.00%]
9,912,523 iTLB-load-misses #0.06% of all iTLB cache hits
2.004872274 seconds time elapsed
启用大页需要硬件和操作系统的支持,并且需要对系统进行适当的配置。注意:启动大页,MYSQL会部分使用大页,大部分不使用大页的欺骗情况的出现.
合作电话:010-64087828
社区邮箱:greatsql@greatdb.com