win7上怎么查看单个进程的cpu和内存吗?_原来cpu是这样访问内存的-cpu的NUMA浅析...

一、背景

在线上启动mongoDB时候,有些机器会有下图所示的warning,有些没有,看起来挺奇怪的,

7fbff09317671872cb188364ad90db7f.png

经过研究之后,发现里面的知识还真不少,原来是和cpu的NUMA,不一致内存访问架构有关,后续对于排查MySQL等性能抖动,程序延迟的问题又多了一个思路。

ps:最近确实遇到MySQL的两个性能抖动的疑难杂症,要是当时了解NUMA架构,也可以从这个维度来分析下。

1、MySQL间隔22分钟卡死,整个系统都被MySQL卡住几秒,执行top, htop,df等命令都失效,都被阻塞住了。

2、有次数据库瘦身时,执行了1次DROP TABLE 表名,导致MySQL阻塞了,以前执行过几次都没事,这次操作却因MySQL阻塞了影响了用户。

二、名词解释

前端总线——Front Side Bus(FSB)。是将CPU连接到北桥芯片的总线,是处理器与主板北桥芯片或内存控制集线器之间的数据通道,其频率高低直接影响CPU访问内存的速度。

北桥芯片——Northbridge。其实就是用来处理高速信号的一块芯片。

三、NUMA原理

1、原理介绍

NUMA (Non-Uniform Memory Access)非一致内存访问,是计算机访问内存的一种方式。在早期的计算机访问内存时,都是通过cpu连接到前端总线,前端总线连接到北桥芯片来访问内存的,访问过程如下图所示

67388dab5f7de54e0edefc59441f9d97.png

从图中我们能感觉随着cpu的不断增多,多个cpu都需要通过总线和北桥来访问内存,总线和北桥成为了性能瓶颈,那怎么去优化呢?

为了优化该瓶颈,有了非一致内存访问的架构,cpu厂商会把内存集成在cpu内部,由于存在多个cpu,相对而言就有了本地内存和远程内存,两个节点架构示意图如下所示

78f7bbbd06b7a2ef97fdc4e31622780b.png

cpu访问本地内存的延迟小于远程内存的延迟,这是物理层面限制的。

下图是我们某台服务器cpu的NUMA信息,该机器是32核,从图中可以看出含有两个NUMA节点,每个节点约64G的内存。

c358460c2398d262aa7c910ab90c05aa.png

其中node distances代表节点间的距离,用一个二维的表格来表示,node[i][j]表示node[i] 访问node[j]的距离,比如图中的node[0][0]=10,表示node 0 访问本地的内存距离是10,node[0][1]=21表示node[0]访问node[1]的远程内存距离是21,访问远程内存的距离/访问本地内存的距离=2.1,即21/10=2.1,延迟约2.1倍。

2、内存分配策略

从numactl help信息来看看,numactl提供了4种内存分配策略,(参考文档:https://linux.die.net/man/8/numactl) 即

--interleave=nodes,内存会在传入的节点上轮询分配,当指定节点的内存不足时,操作系统会在其他节点上分配,可以指定多个node,也可以指定"all"

--preferred=node, 倾向于单个节点分配内存,当指定节点的内存不足时,操作系统会在其他节点上分配

--membind=nodes,从指定节点分配内存,当内存不够时,分配内存会失败

--localalloc,总数在当前节点上分配

3、cpu绑定

通过2中的帮助文档,我们还发现numactl提供了两种cpu绑定策略,将进程绑定在某些cpu中,nginx也提供了绑定cpu来优化性能的方式,通过减少cpu的切换,提高效率。

--cpunodebind=nodes,将进程绑定到某些节点

--physcpubind=cpus,将进程绑定在物理cpu上

4、关于交换分区

google高级架构师Jeremy Cole 写过一篇关于MySQL“swap insanity”的问题(原文参见 https://blog.jcole.us/),节选了如下的截图部分,他推荐的是在启动MySQL的时候采用interleave=all的策略,来优化内存看起来充足,但因频繁swap导致的性能问题。看似一个小的改变,却对性能有很大的提升。关于MySQL如何利用NUMA架构优化性能,这里就不展开讨论了

b509d5066f78df900df366d0f372b4c0.png

感兴趣的可以查看原文,我们重点说明下swap是怎么引起问题的。

假设我们有NUMA架构的2个节点,各32G,共64G,已使用内存36G,剩余28G。如下图所示,看着内存非常充足,但是由于不均匀的内存分配策略,node[0]的本地被全部占用,但有些操作是必须要使用本地内存的, 会导致node[0] 中的内存被交换到了文件系统上,内存的频繁换入和换出会使 MySQL 的查询随机地出现延迟,而一旦发生了交换分区,可能就是性能下降的开始。

7581222df939453202ae5ea0a5339857.png

(内存不均匀分配)

为了解决内存换入换出的问题,Jeremy Cole 推进使用内存均匀的分配策略,即interleave

7bca4e99274a732e374dd504762c1846.png

(内存均匀分配)

四、numactl介绍

numactl 是用来控制NUMA架构下cpu、内存分配策略的命令,上文中已有cpu绑定、内存分配的介绍。这里介绍几个常用的其它参数

1、查看硬件对NUMA的支持,执行numactl --hardware

available: 1 nodes (0)

node 0 cpus: 0 1 2 3 4 5 6 7

node 0 size: 15891 MB

node 0 free: 2338 MB

node distances:

node 0

0: 10

2、查看当前策略,执行 numactl --show

policy: default

preferred node: current

physcpubind: 0 1 2 3 4 5 6 7

cpubind: 0

nodebind: 0

membind: 0

五、总结

1、NUMA架构中访问本地内存比远程内存快很多,本文中是2.1倍左右的差距

2、NUMA内存、cpu分配策略会影响程序的性能,可以根据程序的具体情况区分对待,对于MongoDB,MySQL这种耗内存的程序,建议采用均匀的分配策略。

注:Linux中的 /proc/sys/vm/zone_reclaim_mode值可配置NUMA内存节点不足时的内存回收策略,默认是关闭的。如果配置了激进的回收策略,也会影响程序的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值