转自:
https://blog.51cto.com/hl914/1557615
先要说的是,并不是所有的场景都适合绑定的,当出现内存交叉访问,或者缓存命中较低时,或者你想把某进程运行在特定的CPU上时可以进行绑定。那么要先知道怎么查看是否出现了交叉内存访问。
那么除了交叉内存访问,还有什么值得我们去绑定进程呢?
那就了解下内存贬值吧:
如果很多进程运行在CPU的某一个核心之上,我们都知道,CPU核心都是和L1直接打交道的,而各个进程间呢,还是切换着轮流运行的,如果我L1中全部缓存了进程A的数据,那么当我进程B或进程C运行时,极有可能会置换L1中的缓存数据,如果A进程没有运行完,当进程A再次执行时,还需要去置换L1中的缓存数据,这样,各个进程运行时可能每次都要置换L1中的数据,可能大部分时间都浪费在了置换缓存上,所以,我们可以将对性能敏感的进程绑定到某一个或一组核心,将多线程的程序也绑定到某一核心,这样,将大大提高服务器性能。
先来说numastat这个命令:
这个命令主要是显示进程与每个numa节点的内存分配的统计数据和分配的成功与失败情况。先上个图:
可以看到我这里只有一个Node节点,也就是说只有一颗CPU,所以可能看不出效果。
numa_hit---命中的,也就是为这个节点成功分配本地内存访问的内存大小
numa_miss---把内存访问分配到另一个node节点的内存大小,这个值和另一个node的numa_foreign相对应。
numa_foreign--另一个Node访问我的内存大小,与对方node的numa_miss相对应
interleave_hit---这个参数暂时不明确
local_node----这个节点的进程成功在这个节点上分配内存访问的大小
other_node----这个节点的进程 在其它节点上分配的内存访问大小
很明显,miss值和foreign值越高,就要考虑绑定的问题。
numastat的常用参数:
-c:紧凑的显示信息,并将内存四舍五入到MB单位,如果节点较多,可以使用这个参数,看图,来看下效果:
单位都变成了MB了
-m:显示每个节点中,系统范围内使用内存的情况,可以与其它参数组合使用:
-n:以原格式显示,但单位为MB
-p:可以指定pid或指定某Node
-s:进行排序,查看的更直观:
-z:忽略所有为0的行和列
下面再来说一下一个绑定的命令,numactl,这个命令可以将某个进程绑定到某个node或某个node上的某个或某组核心上。
--show:可以查看当前的numa策略,
-H:可以显示各Node中内存使用情况
--membind:只从某节点分配内存,当某节点内存不足,则会分配失败,格式:
numactl --membind=nodes program(nodes写你要分配的节点0或1或者其它节点数,后面是程序,可以写绝对路径,也可写服务启动脚本)
--numactl:把进程绑定到某节点上,用法如下:
numactl --cpunodebind=nodes program(nodes为Cpu节点,后面跟程序,)
--physcpubind:把进程绑定到某核心上,如果程序运行,用法如下(参数太长就简写了,其它简写参数自己Man):
numactl -C 1,3 httpd
--localalloc:指令永远在当前节点分配内存,用法:
numactl -l httpd
--preferred:如果指定的内存无法分配足够的空间,可以指定去某一个节点的内存分配,格式如下:
numactl --preferred=0 httpd
上面的大部分参数需要停止服务后执行。机器重启配置失效。
在redhat6中,有一个numad的服务(需手工安装),它可以自动的监控我们cpu状况,并自动平衡资源,这个服务需要在内存使用量非常大的时候才会有明显的效果,当内存空余量较大时,需要关闭KSM,避免发生冲突。官方说在某些内存使用巨大的环境中,可能会提高50%的性能。
两种使用方法:
1.service numad start
2.numad -S 0 -p pid 使用numad -i 0 停止
numad暂时没有使用过,了解的不多。。
原文链接:
https://blog.51cto.com/hl914/1557615
SMP(Symmetric Multi-Processor)
所谓对称多处理器结构,是指服务器中多个
CPU
对称工作,无主次或从属关系。各
CPU
共享相同的物理内存,每个
CPU
访问内存中的任何地址所需时间是相同的,因此SMP也被称为一致存储器访问结构(UMA:Uniform
Mem
ory Access)。对SMP服务器进行扩展的方式包括增加内存、使用更快的
CPU
、增加
CPU
、扩充I/O(槽口数与总线数)以及添加更多的外部设备(通常是磁盘存储)。
SMP服务器的主要特征是共享,系统中所有资源(C
为了消除UMA
架构
的瓶颈,硬件工程师将原集成在北桥芯片中的内存控制器进行了拆分,将其集成到
cpu
中,一般一个
cpu
socket都有一个独立的内存控制器,每个
cpu
socket也独立连接到一部分对立的内存,这部分
CPU
直连的内存被称为本地内存。虽然48GB的内存没有到达主机64GB的内存上限,但是当某些数据必须要在
NUMA
节点0的内存上分配时,就会导致
NUMA
节点0中的内存被交换出内存为新的内存请求让出位置,shared_buffer的内存的频繁换入和换出会使服务器的性能下降。
Numa
(Non-Uniform
Mem
ory Access)是一种计算机
架构
,它允许多个处理器通过共享内存来访问系统的物理内存,但是不同的内存区域可能由不同的处理器处理,这种内存访问方式被称为“非一致性内存访问”。在这种
架构
中,每个处理器都有自己的本地内存,但它们可以访问其他处理器的内存。这种
架构
可以提高多处理器系统的性能,并使系统更具可扩展性。在
Numa
系统中,每个处理器有一个本地内存子系统,每个本地内存子系统都连接到一个全局内存交换网络。
什么是
NUMA
?早期的计算机,内存控制器还没有整合进
CPU
,所有的内存访问都需要经过北桥芯片来完成。如下图所示,
CPU
通过前端总线(FSB,Front Side Bus)连接到北桥芯片,然后北桥芯片连接到内存——内存控制器集成在北桥芯片里面。这种
架构
被称为 UMA1(Uniform
Mem
ory Access, 一致性内存访问 ):总线模型保证了
CPU
的所有内存访问都是一致的,...
NUMA
VS. UMA
NUMA
(Non-Uniform
Mem
ory Access)非均匀内存访问
架构
是指多处理器系统中,内存的访问时间是依赖于处理器和内存之间的相对位置的。 这种设计里存在和处理器相对近的内存,通常被称作本地内存;还有和处理器相对远的内存, 通常被称为非本地内存。
UMA(Uniform
Mem
ory Access)均匀内存访问
架构
则是与
NUMA
相反,所以处理器对共享内存的访问距离和时间是相同的。由此可知,不论
numa
c
tl
命令用于控制
进程
与共享存储的
NUMA
技术机制。语法
numa
c
tl
[--interleave nodes] [--preferred node] [--
mem
bind
nodes] [--
cpu
node
bind
nodes] [--phys
cpu
bind
cpu
s] [--localalloc] [--] {arguments ...}
numa
c
tl
--show
numa
c
tl
--...
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/mysql_multi_using_
numa
c
tl
.html关于
NUMA
的介绍我这里就不多说了,网上太多资料了,我在这篇文章要介绍的是如何在MySQL多实例场景下使用
numa
c
tl
来
绑定
各个实例到具体的物理节点上,避...
一、什么是
numa
?
NUMA
(Non-Uniform
Mem
ory Access),非一致性内存访问,是一种计算机内存的设计方式,这种设计模式将内存分为本地内存和远程内存由于
CPU
访问本地内存比访问远程内存的路径短,导致访问本地内存的延迟会小于访问远程内存通过
numa
c
tl
可以查看
numa
的节点信息#
numa
c
tl
-Havailable: 2 nodes (0-1)node0
cpu
s: 0 1...
S
TL
中关于
mem
_fn,
mem
_fun,
mem
_fun_ref,
bind
的记录
mem
_fn系列是把S
TL
和面向对象编程结合在一起的有效方法。
关于这系列的函数详情,可以去www.cplusplus.com去查,这里记录几个在使用过程中遇到的问题以及思考。
mem
_fn系列函数可以
绑定
对象的 无参成员函数
如果放入容器的是对象,则使用
mem
_fun_ref或者
mem
_fn函数。
如果放入容器...
很多时候,我们测试mysql性能,开启mysqld_multi功能,开多个mysql实例,同时使用
numa
工具
绑定
cpu
,内存资源,防止多个mysql实例间资源竞争,影响性能,或者测试数据mysqld_multi功能的开启在其他文章中已经介绍,这里主要讲的是
numa
绑定
系统资源,在新版本的li
nu
x内核中,已经很好的支持了
numa
功能,命令行输入
numa
c
tl
可以看到一些
numa
信息#
numa
ct...