numastat命令详解

  

基础命令学习目录html

 

做者:【吴业亮】
博客:http://blog.csdn.net/wylfengyujiancheng
1、系统架构的演进从SMP到NUMA
一、SMP(Symmetric Multi-Processor)

 

所谓对称多处理器结构,是指服务器中多个CPU对称工做,无主次或从属关系。各CPU共享相同的物理内存,每一个 CPU访问内存中的任何地址所需时间是相同的,所以SMP也被称为一致存储器访问结构(UMA:Uniform Memory Access)。对SMP服务器进行扩展的方式包括增长内存、使用更快的CPU、增长CPU、扩充I/O(槽口数与总线数)以及添加更多的外部设备(一般是磁盘存储)。
SMP服务器的主要特征是共享,系统中全部资源(CPU、内存、I/O等)都是共享的。也正是因为这种特征,致使了SMP服务器的主要问题,那就是它的扩展能力很是有限。对于SMP服务器而言,每个共享的环节均可能形成SMP服务器扩展时的瓶颈,而最受限制的则是内存。因为每一个CPU必须经过相同的内存总线访问相同的内存资源,所以随着CPU数量的增长,内存访问冲突将迅速增长,最终会形成CPU资源的浪费,使 CPU性能的有效性大大下降。
有实验数据代表,SMP型的服务器CPU最好是2-4颗就OK了,多余的就浪费了。

 

二、NUMA(Non-Uniform Memory Access)

 

因为SMP在扩展能力上的限制,人们开始探究如何进行有效地扩展从而构建大型系统的技术,NUMA就是这种努力下的结果之一。利用NUMA技术,能够把几十个CPU(甚至上百个CPU)组合在一个服务器内。NUMA服务器的基本特征是具备多个CPU模块,每一个CPU模块由多个CPU(如4个)组成,而且具备独立的本地内存、I/O槽口等。因为其节点之间能够经过互联模块(如称为Crossbar Switch)进行链接和信息交互,所以每一个CPU能够访问整个系统的内存(这是NUMA系统与MPP系统的重要差异)。显然,访问本地内存的速度将远远高于访问远地内存(系统内其它节点的内存)的速度,这也是非一致存储访问NUMA的由来。因为这个特色,为了更好地发挥系统性能,开发应用程序时须要尽可能减小不一样CPU模块之间的信息交互。利用NUMA技术,能够较好地解决原来SMP系统的扩展问题,在一个物理服务器内能够支持上百个CPU。比较典型的NUMA服务器的例子包括HP的Superdome、SUN15K、IBMp690等。
每一个CPU模块之间都是经过互联模块进行链接和信息交互,CPU都是互通互联的,同时,每一个CPU模块平均划分为若干个Chip(很少于4个),每一个Chip都有本身的内存控制器及内存插槽。
在NUMA中还有三个节点的概念:
1)、本地节点:对于某个节点中的全部CPU,此节点称为本地节点。
2)、邻居节点:与本地节点相邻的节点称为邻居节点。
3)、远端节点:非本地节点或邻居节点的节点,称为远端节点。
4)、邻居节点和远端节点,都称做非本地节点(Off Node)。
CPU访问不一样类型节点内存的速度是不相同的,访问本地节点的速度最快,访问远端节点的速度最慢,即访问速度与节点的距离有关,距离越远访问速度越慢,此距离称做Node Distance。应用程序要尽可能的减小不通CPU模块之间的交互,若是应用程序能有方法固定在一个CPU模块里,那么应用的性能将会有很大的提高。
2、NUMA实践
一、安装numactl工具
Linux提供了一个一个手工调优的命令numactl(默认不安装)
#yum install numactl -y
1
#numactl --hardware  列举系统上的NUMA节点
1
二、查看numa状态
# numactl  --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
cpubind: 0 1
nodebind: 0 1
membind: 0 1
1234567
# numastat
                           node0           node1
numa_hit              1296554257       918018444
numa_miss                8541758        40297198
numa_foreign            40288595         8550361
interleave_hit             45651           45918
local_node            1231897031       835344122
other_node              64657226        82674322
12345678
说明:
numa_hit—命中的,也就是为这个节点成功分配本地内存访问的内存大小
numa_miss—把内存访问分配到另外一个node节点的内存大小,这个值和另外一个node的numa_foreign相对应。
numa_foreign–另外一个Node访问个人内存大小,与对方node的numa_miss相对应
local_node----这个节点的进程成功在这个节点上分配内存访问的大小
other_node----这个节点的进程 在其它节点上分配的内存访问大小
很明显,miss值和foreign值越高,就要考虑绑定的问题。
三、numad服务
在redhat6中,有一个numad的服务(需手工安装),它能够自动的监控咱们cpu情况,并自动平衡资源,这个服务须要在内存使用量很是大的时候才会有明显的效果,当内存空余量较大时,须要关闭KSM,避免发生冲突。官方说在某些内存使用巨大的环境中,可能会提升50%的性能。
# service numad start
1
四、查看cpu和内存使用状况
# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
node 0 size: 64337 MB
node 0 free: 1263 MB
node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31
node 1 size: 64509 MB
node 1 free: 30530 MB
node distances:
node   0   1
  0:  10  21
  1:  21  10
123456789101112
cpu0 可用 内存  1263 MB
cpu1 可用内存 30530 MB
当cpu0上申请内存超过1263M时一定使用swap,这个是很不合理的。
这里假设我要执行一个java param命令,此命令须要1G内存;一个python param命令,须要8G内存。
最好的优化方案时python在node1中执行,而java在node0中执行,那命令是:
#numactl --cpubind=0 --membind=0 python param
#numactl --cpubind=1 --membind=1 java param
12
五、NUMA的内存分配策略
1.缺省(default):老是在本地节点分配(分配在当前进程运行的节点上);
2.绑定(bind):强制分配到指定节点上;
3.交叉(interleave):在全部节点或者指定的节点上交织分配;
4.优先(preferred):在指定节点上分配,失败则在其余节点上分配。
由于NUMA默认的内存分配策略是优先在进程所在CPU的本地内存中分配,会致使CPU节点之间内存分配不均衡,当某个CPU节点的内存不足时,会致使swap产生,而不是从远程节点分配内存。这就是所谓的swap insanity 现象。
举例:
# numactl --hardware
node 0 cpus: 0 2 4 6
node 0 size: 65490 MB
node 0 free: 24447 MB
node 1 cpus: 1 3 5 7
node 1 size: 65536 MB
node 1 free: 16050 MB
node distances:
node   0   1
  0:  10  20
  1:  20  10
1234567891011
能够看到numa节点是2个,cpu物理节点是8个
如今咱们绑定资源,两颗cpu,每颗4个物理节点,那么咱们开4个mysql实例,每一个实例绑定2个cpu物理节点
numactl --physcpubind=0,3 --localalloc  mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start 1
1
–physcpubind 指定绑定的cpu节点,
–localalloc表示使用内存方式,不交叉,以避免下降性能,
mysqld_multi是mysql实例启动命令
3、如何关闭NUMA
方法一:经过bios关闭
BIOS:interleave = Disable / Enable
方法二:经过OS关闭
一、编辑 /etc/default/grub 文件,加上:numa=off
GRUB_CMDLINE_LINUX="crashkernel=auto numa=off rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
1
二、从新生成 /etc/grub2.cfg 配置文件:
# grub2-mkconfig -o /etc/grub2.cfg
1
三、重启操做系统
# reboot
1
四、确认:
# dmesg | grep -i numa
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto numa=off rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet[    0.000000] NUMA turned off[    0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto numa=off rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet
# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto numa=off rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet
---------------------
做者:二进制-程序猿
来源:CSDN
原文:https://blog.csdn.net/wylfengyujiancheng/article/details/85417675
版权声明:本文为博主原创文章,转载请附上博文连接!
 
原文连接:https://www.cnblogs.com/tcicy/p/10191505.html

  在os层numa关闭时,打开bios层的numa会影响性能,QPS会降低15-30%;java

  在bios层面numa关闭时,不管os层面的numa是否打开,都不会影响性能。 node

      安装numactl:  
      #yum install numactl -y
      #numastat      等同于 cat /sys/devices/system/node/node0/numastat ,/sys/devices/system/node/文件夹中记录系统中的全部内存节点的相关详细信息。        #numactl --hardware  列举系统上的NUMA节点
python

      #numactl  --show   查看绑定信息mysql

 

 

 

      Redhat或者Centos系统中能够经过命令判断bios层是否开启numa
      # grep -i numa /var/log/dmesg
      若是输出结果为: No NUMA configuration found 
      说明numa为disable,若是不是上面内容说明numa为enable,例如显示:NUMA: Using 30 for the hash shift.
      能够经过lscpu命令查看机器的NUMA拓扑结构。linux

当发现numa_miss数值比较高时,说明须要对分配策略进行调整。例如将指定进程关联绑定到指定的CPU上,从而提升内存命中率。ios


---------------------------------------------算法

     如今的机器上都是有多个CPU和多个内存块的。之前咱们都是将内存块当作是一大块内存,全部CPU到这个共享内存的访问消息是同样的。这就是以前广泛使用的SMP模型。可是随着处理器的增长,共享内存可能会致使内存访问冲突愈来愈厉害,且若是内存访问达到瓶颈的时候,性能就不能随之增长。NUMA(Non-Uniform Memory Access)就是这样的环境下引入的一个模型。好比一台机器是有2个处理器,有4个内存块。咱们将1个处理器和两个内存块合起来,称为一个NUMA node,这样这个机器就会有两个NUMA node。在物理分布上,NUMA node的处理器和内存块的物理距离更小,所以访问也更快。好比这台机器会分左右两个处理器(cpu1, cpu2),在每一个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样NUMA node1的cpu1访问memory1.1和memory1.2就比访问memory2.1和memory2.2更快。因此使用NUMA的模式若是能尽可能保证本node内的CPU只访问本node内的内存块,那这样的效率就是最高的。sql

在运行程序的时候使用numactl -m和-physcpubind就能制定将这个程序运行在哪一个cpu和哪一个memory中。玩转cpu-topology 给了一个表格,当程序只使用一个node资源和使用多个node资源的比较表(差很少是38s与28s的差距)。因此限定程序在numa node中运行是有实际意义的。mongodb

可是呢,话又说回来了,制定numa就必定好吗?--numa的陷阱。SWAP的罪与罚文章就说到了一个numa的陷阱的问题。现象是当你的服务器还有内存的时候,发现它已经在开始使用swap了,甚至已经致使机器出现停滞的现象。这个就有多是因为numa的限制,若是一个进程限制它只能使用本身的numa节点的内存,那么当自身numa node内存使用光以后,就不会去使用其余numa node的内存了,会开始使用swap,甚至更糟的状况,机器没有设置swap的时候,可能会直接死机!因此你可使用numactl --interleave=all来取消numa node的限制。

 

综上所述得出的结论就是,根据具体业务决定NUMA的使用。

若是你的程序是会占用大规模内存的,你大多应该选择关闭numa node的限制(或从硬件关闭numa)。由于这个时候你的程序颇有概率会碰到numa陷阱。

另外,若是你的程序并不占用大内存,而是要求更快的程序运行时间。你大多应该选择限制只访问本numa node的方法来进行处理。

---------------------------------------------------------------------

内核参数overcommit_memory :

它是 内存分配策略

可选值:0、一、2。

0:表示内核将检查是否有足够的可用内存供应用进程使用;若是有足够的可用内存,内存申请容许;不然,内存申请失败,并把错误返回给应用进程。

1:表示内核容许分配全部的物理内存,而无论当前的内存状态如何。

2:表示内核容许分配超过全部物理内存和交换空间总和的内存

内核参数zone_reclaim_mode:

可选值0、1

a、当某个节点可用内存不足时:

一、若是为0的话,那么系统会倾向于从其余节点分配内存

二、若是为1的话,那么系统会倾向于从本地节点回收Cache内存多数时候

b、Cache对性能很重要,因此0是一个更好的选择

----------------------------------------------------------------------

mongodb的NUMA问题

mongodb日志显示以下:

WARNING: You are running on a NUMA machine.

We suggest launching mongod like this to avoid performance problems:

numactl –interleave=all mongod [other options]

解决方案,临时修改numa内存分配策略为 interleave=all (在全部node节点进行交织分配的策略):

1.在原启动命令前面加numactl –interleave=all

如# numactl --interleave=all ${MONGODB_HOME}/bin/mongod --config conf/mongodb.conf

2.修改内核参数

echo 0 > /proc/sys/vm/zone_reclaim_mode ; echo "vm.zone_reclaim_mode = 0" >> /etc/sysctl.conf

----------------------------------------------------------------------

1、NUMA和SMP

NUMA和SMP是两种CPU相关的硬件架构。在SMP架构里面,全部的CPU争用一个总线来访问全部内存,优势是资源共享,而缺点是总线争用激烈。随着PC服务器上的CPU数量变多(不只仅是CPU核数),总线争用的弊端慢慢愈来愈明显,因而Intel在Nehalem CPU上推出了NUMA架构,而AMD也推出了基于相同架构的Opteron CPU。

NUMA最大的特色是引入了node和distance的概念。对于CPU和内存这两种最宝贵的硬件资源,NUMA用近乎严格的方式划分了所属的资源组(node),而每一个资源组内的CPU和内存是几乎相等。资源组的数量取决于物理CPU的个数(现有的PC server大多数有两个物理CPU,每一个CPU有4个核);distance这个概念是用来定义各个node之间调用资源的开销,为资源调度优化算法提供数据支持。

2、NUMA相关的策略

一、每一个进程(或线程)都会从父进程继承NUMA策略,并分配有一个优先node。若是NUMA策略容许的话,进程能够调用其余node上的资源。

二、NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind规定进程运行在某几个node之上,而physcpubind能够更加精细地规定运行在哪些核上。

三、NUMA的内存分配策略有localalloc、preferred、membind、interleave。

localalloc规定进程从当前node上请求分配内存;

而preferred比较宽松地指定了一个推荐的node来获取内存,若是被推荐的node上没有足够内存,进程能够尝试别的node。

membind能够指定若干个node,进程只能从这些指定的node上请求分配内存。

interleave规定进程从指定的若干个node上以RR(Round Robin 轮询调度)算法交织地请求分配内存。

 

 

由于NUMA默认的内存分配策略是优先在进程所在CPU的本地内存中分配,会致使CPU节点之间内存分配不均衡,当某个CPU节点的内存不足时,会致使swap产生,而不是从远程节点分配内存。这就是所谓的swap insanity 现象。

MySQL采用了线程模式,对于NUMA特性的支持并很差,若是单机只运行一个MySQL实例,咱们能够选择关闭NUMA,关闭的方法有三种:

1.硬件层,在BIOS中设置关闭

2.OS内核,启动时设置numa=off;

3.能够用numactl命令将内存分配策略修改成interleave(交叉)。

若是单机运行多个MySQL实例,咱们能够将MySQL绑定在不一样的CPU节点上,而且采用绑定的内存分配策略,强制在本节点内分配内存,这样既能够充分利用硬件的NUMA特性,又避免了单实例MySQL对多核CPU利用率不高的问题

3、NUMA和swap的关系

可能你们已经发现了,NUMA的内存分配策略对于进程(或线程)之间来讲,并非公平的。在现有的Redhat Linux中,localalloc是默认的NUMA内存分配策略,这个配置选项致使资源独占程序很容易将某个node的内存用尽。而当某个node的内存耗尽时,Linux又恰好将这个node分配给了某个须要消耗大量内存的进程(或线程),swap就妥妥地产生了。尽管此时还有不少page cache能够释放,甚至还有不少的free内存。

4、解决swap问题

虽然NUMA的原理相对复杂,实际上解决swap却很简单:只要在启动MySQL以前使用numactl –interleave来修改NUMA策略便可。

值得注意的是,numactl这个命令不只仅能够调整NUMA策略,也能够用来查看当前各个node的资源使用状况,是一个很值得研究的命令。

 

 

1、CPU
  首先从CPU提及。
  你仔细检查的话,有些服务器上会有的一个有趣的现象:你cat /proc/cpuinfo时,会发现CPU的频率居然跟它标称的频率不同:
  #cat /proc/cpuinfo
  processor : 5
  model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz
  cpu MHz : 1200.000
  这个是Intel E5-2620的CPU,他是2.00G * 24的CPU,可是,咱们发现第5颗CPU的频率为1.2G。
  这是什么缘由呢?
  这些其实都源于CPU最新的技术:节能模式。操做系统和CPU硬件配合,系统不繁忙的时候,为了节约电能和下降温度,它会将CPU降频。这对环保人士和抵制地球变暖来讲是一个福音,可是对MySQL来讲,多是一个灾难。
  为了保证MySQL可以充分利用CPU的资源,建议设置CPU为最大性能模式。这个设置能够在BIOS和操做系统中设置,固然,在BIOS中设置该选项更好,更完全。因为各类BIOS类型的区别,设置为CPU为最大性能模式千差万别,咱们这里就不具体展现怎么设置了。
  而后咱们看看内存方面,咱们有哪些能够优化的。
  i) 咱们先看看numa
  非一致存储访问结构 (NUMA : Non-Uniform Memory Access) 也是最新的内存管理技术。它和对称多处理器结构 (SMP : Symmetric Multi-Processor) 是对应的。简单的队别以下:
  如图所示,详细的NUMA信息咱们这里不介绍了。可是咱们能够直观的看到:SMP访问内存的都是代价都是同样的;可是在NUMA架构下,本地内存的访问和非 本地内存的访问代价是不同的。对应的根据这个特性,操做系统上,咱们能够设置进程的内存分配方式。目前支持的方式包括:
  --interleave=nodes
  --membind=nodes
  --cpunodebind=nodes
  --physcpubind=cpus
  --localalloc
  --preferred=node
  简而言之,就是说,你能够指定内存在本地分配,在某几个CPU节点分配或者轮询分配。除非 是设置为--interleave=nodes轮询分配方式,即内存能够在任意NUMA节点上分配这种方式之外。其余的方式就算其余NUMA节点上还有内 存剩余,Linux也不会把剩余的内存分配给这个进程,而是采用SWAP的方式来得到内存。有经验的系统管理员或者DBA都知道SWAP致使的数据库性能 降低有多么坑爹。
  因此最简单的方法,仍是关闭掉这个特性。
  关闭特性的方法,分别有:能够从BIOS,操做系统,启动进程时临时关闭这个特性。
  a) 因为各类BIOS类型的区别,如何关闭NUMA千差万别,咱们这里就不具体展现怎么设置了。
  b) 在操做系统中关闭,能够直接在/etc/grub.conf的kernel行最后添加numa=off,以下所示:
  kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM  numa=off
  另外能够设置 vm.zone_reclaim_mode=0尽可能回收内存。
  c) 启动MySQL的时候,关闭NUMA特性:
  numactl --interleave=all mysqld
  固然,最好的方式是在BIOS中关闭。
  ii) 咱们再看看vm.swappiness。
  vm.swappiness是操做系统控制物理内存交换出去的策略。它容许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vm.swappiness设置为0表示尽可能少swap,100表示尽可能将inactive的内存页交换出去。
  具体的说:当内存基本用满的时候,系统会根据这个参数来判断是把内存中不多用到的inactive 内存交换出去,仍是释放数据的cache。cache中缓存着从磁盘读出来的数据,根据程序的局部性原理,这些数据有可能在接下来又要被读 取;inactive 内存顾名思义,就是那些被应用程序映射着,可是 长时间 不用的内存。
  咱们能够利用vmstat看到inactive的内存的数量:
  #vmstat -an 1
  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
  r b swpd free inact active si so bi bo in cs us sy id wa st
  1 0 0 27522384 326928 1704644 0 0 0 153 11 10 0 0 100 0 0
  0 0 0 27523300 326936 1704164 0 0 0 74 784 590 0 0 100 0 0
  0 0 0 27523656 326936 1704692 0 0 8 8 439 1686 0 0 100 0 0
  0 0 0 27524300 326916 1703412 0 0 4 52 198 262 0 0 100 0 0
  经过/proc/meminfo 你能够看到更详细的信息:
  #cat /proc/meminfo | grep -i inact
  Inactive: 326972 kB
  Inactive(anon): 248 kB
  Inactive(file): 326724 kB
  这里咱们对不活跃inactive内存进一步深刻讨论。 Linux中,内存可能处于三种状态:free,active和inactive。众所周知,Linux Kernel在内部维护了不少LRU列表用来管理内存,好比LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用来管理匿名页,LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用来管理page caches页缓存。系统内核会根据内存页的访问状况,不定时的将活跃active内存被移到inactive列表中,这些inactive的内存能够被 交换到swap中去。
  通常来讲,MySQL,特别是InnoDB管理内存缓存,它占用的内存比较多,不常常访问的内存也会很多,这些内存若是被Linux错误的交换出去了,将浪费不少CPU和IO资源。 InnoDB本身管理缓存,cache的文件数据来讲占用了内存,对InnoDB几乎没有任何好处。
  因此,咱们在MySQL的服务器上最好设置vm.swappiness=1或0

 

    先要说的是,并非全部的场景都适合绑定的,当出现内存交叉访问,或者缓存命中较低时,或者你想把某进程运行在特定的CPU上时能够进行绑定。那么要先知道怎么查看是否出现了交叉内存访问。

    那么除了交叉内存访问,还有什么值得咱们去绑定进程呢?

        那就了解下内存贬值吧:   

      若是不少进程运行在CPU的某一个核心之上,咱们都知道,CPU核心都是和L1直接打交道的,而各个进程间呢,仍是切换着轮流运行的,若是我L1中所有缓存了进程A的数据,那么当我进程B或进程C运行时,极有可能会置换L1中的缓存数据,若是A进程没有运行完,当进程A再次执行时,还须要去置换L1中的缓存数据,这样,各个进程运行时可能每次都要置换L1中的数据,可能大部分时间都浪费在了置换缓存上,因此,咱们能够将对性能敏感的进程绑定到某一个或一组核心,将多线程的程序也绑定到某一核心,这样,将大大提升服务器性能。

 

    先来讲numastat这个命令:

      这个命令主要是显示进程与每一个numa节点的内存分配的统计数据和分配的成功与失败状况。先上个图:

        wKiom1QhHCyxxSmFAACZtTqIc-s735.jpg

     

     能够看到我这里只有一个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单位,若是节点较多,可使用这个参数,看图,来看下效果:

            wKiom1QhIg6i0MZfAADozmFt73M202.jpg

            单位都变成了MB了

        -m:显示每一个节点中,系统范围内使用内存的状况,能够与其它参数组合使用:

            wKiom1QhJKmy9eKKAAJ5V4sp14o778.jpg

        -n:以原格式显示,但单位为MB

        -p:能够指定pid或指定某Node

            wKiom1QhJkOSTHT-AAJGq4eJxHs572.jpg

       

        -s:进行排序,查看的更直观:

            wKiom1QhL5rTFpisAAJ6yRwxHvY906.jpg

           -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暂时没有使用过,了解的很少。。

原文连接:http://blog.51cto.com/hl914/1557615

 

命令:
yum install numactl
numastat
numactl --hardware
cat  /sys/class/net/enp129s0f0/device/numa_node
mpstat
 -P ALL
lscpu
一、centos 安装支持numa命令
yum install numactl
二、验证系统是否支持numa
dmesg | grep -i numa查看输出结果:
若是输出结果为:
No NUMA configuration found
说明numa为disable,若是不是上面的内容说明numa为enable
三、查看numa的状态 numastat
numastat
 
numa_hit是打算在该节点上分配内存,最后从这个节点分配的次数;
num_miss是打算在该节点分配内存,最后却从其余节点分配的次数;
num_foregin是打算在其余节点分配内存,最后却从这个节点分配的次数;
interleave_hit是采用interleave策略最后从该节点分配的次数;
local_node该节点上的进程在该节点上分配的次数
other_node是其余节点进程在该节点上分配的次数
四、查看numa相关信息,包括每一个node内存大小,每一个node中的逻辑cpu
numactl --hardware
lscpu命令也能够查看呢cpu和node的关系
五、查看网卡对应的numa node
enp129s0f0是网卡的名字
cat  /sys/class/net/enp129s0f0/device/numa_node
六、查看cpu负载
mpstat -P ALL(须要安装sysstat)

七、 测试(访问不一样节点的内存的IO)(参考http://blog.csdn.net/wu7244582/article/details/52807117)
1)  write 测试
# numactl --cpubind=0 --membind=0 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.823497 s, 1.3 GB/s
 
# numactl --cpubind=0 --membind=1 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.936182 s, 1.1 GB/s
 
明显访问同一节点的内存速度比访问不一样节点内存的速度快。
 
2) read 测试
# numactl --cpubind=0 --membind=0 dd if=/dev/shm/A of=/dev/null  bs=1K count=1024K
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 1.09543 s, 980 MB/s
  # numactl --cpubind=0 --membind=1 dd if=/dev/shm/A of=/dev/null  bs=1K count=1024K 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB) copied, 1.11862 s, 960 MB/s
相关文章
相关标签/搜索