关于NUMA的介绍我这里就不多说了,网上太多资料了,我在这篇文章要介绍的是如何在MySQL多实例场景下使用numactl来绑定各个实例到具体的物理节点上,避免跨节点分配内存和跨节点访问寄存器。
至于为何使用多实例,因为MySQL对于多处理机和大内存的利用效率不佳,采用多实例可以很大程度提高MySQL对资源的利用,详情可以看Percona的白皮书中对多实例的测试:Scaling MySQL With Virident Flash Drives and Multiple Instances of Percona Server
.
numactl这个程序的用法可以参照man手册:http://linux.die.net/man/8/numactl
基本用法是“numactl [option] 程序路径”,例如我希望用numactl启动mysqld则是numactl
[option]
/usr/local/mysql/bin/mysqld。曾经我误以为numactl是控制某一个程序名,汗……亲手做过才明白是程序路径。
我只介绍几个重要参数
–interleave=all 这是使用交叉分配模式启动一个程序,也就是说程序可以随意跨节点用其他节点的内存,传说中这是效率最高的关闭NUMA特性的方法,只是传说。
–cpunodebind=node 这是把程序绑定在指定的node节点上运行,即使另一个物理节点是idle的,也不会去使用。
–localalloc 严格控制只在节点内分配内存,禁止分配其他节点下的内存到当前节点运行的程序。
我们启动MySQL希望的参数是 numactl –cpunodebind=node –localalloc mysqld_path
为了运维方便,我不可能每次mysql启动都这么执行,我依然希望通过/etc/init.d/mysql和mysqld_multi来管理mysql启动和关闭,于是我采用自定义启动脚本的方式。
首先编写自定义启动脚本如下:
#!/bin/sh
# Program Path
NUMACTL=`which numactl`
MYSQLD=/usr/alibaba/mysql/libexec/mysqld
PS=`which ps`
GREP=`which grep`
CUT=`which cut`
WC=`which wc`
EXPR=`which expr`
# Variables
CPU_BIND=(`$NUMACTL --show | $GREP nodebind | $CUT -d: -f2 `) # CPU bins list
CPU_BIND_NUM=${#CPU_BIND[@]} # How many CPU binds
MYSQLD_NUM=`$PS aux | $GREP mysqld | $GREP -v grep | $GREP '\<mysqld\>' | $WC -l`
MYSQLD_NUM=`$EXPR $MYSQLD_NUM + 1`
BIND_NO=`$EXPR $MYSQLD_NUM % $CPU_BIND_NUM ` # Calc Which CPU to Bind
# echo CMD
echo "$NUMACTL --cpunodebind=$BIND_NO --localalloc $MYSQLD" > /tmp/mysqld.$MYSQLD_NUM
# use exec to avoid having an extra shell around.
exec $NUMACTL --cpubind=$BIND_NO --localalloc $MYSQLD "$@"
方法是查看当前有多少个mysqld进程已经存在,并且通过numactl
–show判断有多少个物理节点,从而判断当前的进程应该分配给哪个节点,例如有2个物理节点,没有mysqld进程,则分配当前进程到0节点,再启动一
个实例,当前已经有1个mysqld进程,则分配到1节点,再启动一个实例到0节点……依次循环。
然后在my.cnf文件中配置使用我们自己的脚本启动:
[mysqld_safe]
......
ledir=/usr/local/mysql/bin/ # 放自定义脚本的目录
mysqld=mysqld_using_numactl # 自定义脚本的名称
然后再用/etc/init.d/mysql或mysqld_multi启动mysqld进程就可以实现绑定了。
你可以先启动一个实例,然后在MySQL里做一些消耗CPU的操作,可以观察到只有一个物理节点上的core有活动,哪怕这个节点的core全是100%的利用率,另一个节点的core也全部都是闲的~
有兴趣的话赶紧尝试一下吧~
分享到:
相关推荐
Oracle-NUMA绑定脚本Oracle-NUMA绑定脚本Oracle-NUMA绑定脚本Oracle-NUMA绑定脚本Oracle-NUMA绑定脚本Oracle-NUMA绑定脚本
基于CC-NUMA的多处理器系统研究.pdf
完美获取 CPU 的 NUMA节点数、CPU插槽个数 、 核心数 、 逻辑处理器数(线程数)、名字、制造商、指令集、主频、等等
基于cc-NUMA多核处理器构架的虚拟机监控器原型设计与实现.pdf
使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache) 使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数...
针对NUMA架构的多核处理器,进行各个内存节点以及对应cache的访存验证。
网络游戏-基于NUMA高性能网络处理器负载的虚拟处理器调度方法.zip
numa: Simulate NUMA-sensitive workload and measure their NUMA performance.
对于多处理器系统,比较流行的有3种模式,对称多处理(Symmetric Multiprocessing,SMP)模式、非均匀存储访问(Non Uniform. Memory Access,NUMA)模式、大规模并行处理(Massively Parallel Processing,MPP)模式。SMP...
对tcmalloc算法的更改,支持numa架构,在numa架构下有更好的性能
NUMA架构的基本概念以及NUMA API的使用方法
Linux中NUMA技术.pdf
vSphere NUMA技术架构概述.pptx
SGI小型机NUMA架构介绍,详细介绍了Origin 2000系列小型机ccNuma架构实现
这是第12次上海 Spark Meetup的分享资料.本文回顾NUMA的技术要点以及它如何影响内存密集型Spark应用程序的性能。然后将介绍识别NUMA性能问题的工具和方法,以及作者团队为Spark任务调度添加NUMA感知方面的工作。
本文主要介绍了什么是NUMA 调度器,NUMA系统在市场上的应用越来越广泛,许多厂商都成功推出了基于 NUMA 架构的服务器,本文重点讨论了当前 Linux 的 NUMA 技术,主要包括:存储管理、NUMA 调度和用户层的 API,并在 ...
NUMA对单侧RDMA交互影响的性能评估-CR-SRDS-2020
Un-shared memory access.最新的X86 CPU体系结构。多核多线程,共享cache访问。
NUMA emulation for Linux v2.13.6.