菜鸟笔记
提升您的技术认知

linux工具之numactl-ag真人游戏

  numa(non-uniform memory access)字面直译为“非一致性内存访问”,对于linux内核来说最早出现在2.6.7版本上。这种特性对于当下大内存 多cpu为潮流的x86平台来说确实会有不少的性能提升,但相反的,如果配置不当的话,也是一个很大的坑。本文就从头开始说说linux下关于cpu numa特性的配置和调优。
  最早intel在nehalem架构上实现了numa,取代了在此之前一直使用的fsb前端总线的架构,用以对抗amd的hypertransport技术。一方面这个架构的特点是内存控制器从传统的北桥中移到了cpu中,排除了商业战略方向的考虑之外,这样做的方法同样是为了实现numa。
  在smp多cpu架构中,传统上多cpu对于内存的访问是总线方式。是总线就会存在资源争用和一致性问题,而且如果不断的增加cpu数量,总线的争用会愈演愈烈,这就体现在4核cpu的跑分性能达不到2核cpu的2倍,甚至1.5倍!理论上来说这种方式实现12core以上的cpu已经没有太大的意义。
  intel的numaag真人游戏的解决方案,litrin始终认为它来自本家的安藤。他的模型有点类似于mapreduce。放弃总线的访问方式,将cpu划分到多个node中,每个node有自己独立的内存空间。各个node之间通过高速互联通讯,通讯通道被成为quickpath interconnect即qpi。
  这个架构带来的问题也很明显,如果一个进程所需的内存超过了node的边界,那就意味着需要通过qpi获取另一node中的资源,尽管qpi的理论带宽远高于传统的fsb,比如当下流行的内存数据库,在这种情况下就很被动了。
  linux提供了一个一个手工调优的命令numactl(默认不安装),首先你可以通过它查看系统的numa状态:

root@dc-skyeye:/usr/bin# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
node 0 size: 131037 mb
node 0 free: 3019 mb
node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
node 1 size: 131071 mb
node 1 free: 9799 mb
node distances:
node 0 1
 0: 10 20
 1: 20 10

  此系统共有2个node,各领取16个cpu和128g内存。
  这里假设我要执行一个java param命令,此命令需要120g内存,一个python param命令,需要16g内存。最好的优化方案时python在node0中执行,而java在node1中执行,那命令是:

# numactl --cpubind=0 --membind=0 python param
# numactl --cpubind=1 --membind=1 java param

  当然,也可以自找没趣

# numactl --cpubind=0 --membind=0,1 java param

  对于一口气吃掉内存大半的mongodb,我的配置是:

# numactl --interleave=all mongod -f /etc/mongod.conf

  即分配所有的node供其使用,这也是官方推荐的用法。
  通过numastat命令可以查看numa状态

# numastat
 node0 node1
numa_hit 1775216830 6808979012
numa_miss 4091495 494235148
numa_foreign 494235148 4091495
interleave_hit 52909 53004
local_node 1775205816 6808927908
other_node 4102509 494286252

  other_node过高意味着需要重新规划numa.

nuna与smp

  numa(non-uniform memory access,非一致性内存访问)和smp(symmetric multi-processor,对称多处理器系统)是两种不同的cpu硬件体系架构。
  smp的主要特征是共享,所有的cpu共享使用全部资源,例如内存、总线和i/o,多个cpu对称工作,彼此之间没有主次之分,平等地访问共享的资源,这样势必引入资源的竞争问题,从而导致它的扩展内力非常有限。
  numa技术将cpu划分成不同的组(node),每个node由多个cpu组成,并且有独立的本地内存、i/o等资源。node之间通过互联模块连接和沟通,因此除了本地内存外,每个cpu仍可以访问远端node的内存,只不过效率会比访问本地内存差一些,我们用node之间的距离(distance,抽象的概念)来定义各个node之间互访资源的开销。

node->socket->core->processor

随着多核技术的发展,将多个cpu封装在一起,这个封装被称为插槽socket;core是socket上独立的硬件单元;通过intel的超线程ht技术进一步提升cpu的处理能力,os看到的逻辑上的核数processor。

socket = node

socket是物理概念,指的是主板上cpu插槽;node是逻辑概念,对应于socket。

core = 物理cpu

core是物理概念,一个独立的硬件执行单元,对应于物理cpu;

thread = 逻辑cpu = processor

thread是逻辑cpu,也就是processor。 




网站地图