MySQL 5.7 InnoDB缓冲池NUMA功能支持——但是别高兴的太早
当前CPU都已是NUMA架构,相信除了历史遗留系统,很少会有数据库跑在SMP的CPU上了。NUMA架构带来的优势无言而语,CPU更快的内存访问速度,但是带来的问题也不言而喻,特别是对于数据库的影响。MySQL之前“臭名昭著”的swap问题就是因为NUMA架构导致。大部分同学已经知道应对技巧,即在启动文件中加入:
numactl --interleave=all mysqld ...
or
numactl –cpunodebind=node –localalloc mysqld ...
MongoDB官方的启动文件大致也是这么写的。但是这样的处理方式在Inside君看来并不是最优的。因为NUMA的优势在于本地内存的申请速度。因此,对于数据库来说,一个好的策略应该是诸如缓冲池这样的全局内存可以向所有节点申请内存,而线程级别的内存还是坚持本地分配策略。
MySQL 5.7 InnoDB提供了新的参数innodb_numa_interleave,即缓冲池内存的分配策略采用interleave的方式。官方文档中的说明如下:
Enables the NUMA interleave memory policy for allocation of the InnoDB buffer pool. Wheninnodb_numa_interleave is enabled, the NUMA memory policy is set to MPOL_INTERLEAVE for the mysqld process. After the InnoDB buffer pool is allocated, the NUMA memory policy is set back to MPOL_DEFAULT. For theinnodb_numa_interleave option to be available, MySQL must be compiled on a NUMA-enabled system.
实现代码也比较优雅,有兴趣的同学可以看下。不过当你高兴InnoDB终于支持NUMA特性时,MySQL又给我们泼了冷水:
root@test-1# bin/mysqld -V
bin/mysqld Ver 5.7.12 for linux-glibc2.5 on x86_64 (MySQL Community Server (GPL))
root@test-1# bin/mysqld --help -v | grep numa
最新的5.7.12版本竟然找不到此参数。但是没有关系,开源的魅力在于折腾,于是乎修改了2行代码,编译安装后参数innodb_numa_interleave就又出现了:
root@test-1:/mdata/mysql/mysql-5.7.12/bld# sql/mysqld -v --help | grep numa
--innodb-numa-interleave
innodb-numa-interleave FALSE
小伙伴可尝试自己去解决看看,第一个回复并答对的小伙伴,将获得姜老师提供的价值1000元的某云服务提供商代金券一张哦~~~
不过,相比Microsoft SQL Server,MySQL的NUMA支持依然不够完善,因为Microsoft SQL Server在2005版本就已经支持NUMA特性,并且提供了相应的命令来进行控制,如:
ALTER SERVER CONFIGURATION SET PROCESS AFFINITY CPU=0 TO 3;
这样做的好处是,比如在多实例环境下,用户可以更为灵活的控制内存的分配。但是要实现此功能,貌似也不是一件难事哦,有谁愿意实现给InnoSQL贡献自己的一份力量呢?
PS:Inside君的2016年MySQL网络培训班又将开始啦~~~,具体点击:2016年最好的MySQL数据库网络培训又来了 零基础、Oracle DBA、MySQL DBA的同学们都来吧,跟着姜老师的思考方式来系统的学习MySQL。