yangjianxv
作者yangjianxv2016-11-17 16:06
部门总经理, 成方金融科技有限公司

性能指标之资源指标 CPU亲和性原理介绍及如何量化读数

字数 3180阅读 9128评论 0赞 6

虚拟化环境下,测试环境部署阶段、性能问题分析阶段,有时需关注进程与虚拟CPU的亲和性,虚拟CPU与物理CPU的亲和性,以及CPU与内存的亲和性,必要时进行亲和性的调整。

本节主要介绍亲和性中的几个概念,以及如何获取亲和性的具体读数。

亲和性介绍

CPU亲和性通常被解释为进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,由此也有一些方法把某个进程绑定在某个CPU上,然而这是比较狭义的亲和性。

亲和性(affinity)指的是两个事物选择性地粘着的现象,比如细胞的亲和性是指细胞间选择性地粘着的现象。

如果说到CPU亲和性,进程是要跑在CPU上 ,如果进程始终跑在同一个CPU上,那么进程上下文切换的代价是最小的,执行效率最高,如果进程换到另一个CPU上运行,则存在上下文切换的代价,执行效率下降。为什么会有这种现象?

所谓的“进程上下文”,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容。当内核需要切换到另一个进程时,需要把这些上下文从当前CPU切出去,保存在其他地方(缓存),以便这个进程在这个CPU上再次执行该进程时,能够恢复切换时的状态,继续执行。

之所以进程希望跑在同一个CPU上,其实就是要这个CPU对应的、已经缓存了的上下文数据。如果这个进程即使第二次运行跑在了同一个CPU,而这个CPU没有它上次切出时的上下文,这种亲和性也就丧失了意义。

所以CPU亲和性应该是进程-CPU-缓存的亲和性。首先,进程是要跑在CPU上,所以有进程和CPU之间的亲和性;第二,进程切回来需要CPU要读数据的时候,是从一级一级的缓存(cache)里面读取的(内存也可以理解为是缓存的一种),因此也就有CPU和缓存的亲和性。

1.进程和CPU之间的亲和性

如果进程大部分情况下是在同一个CPU上运行的,那么它的亲和性就比较好。
然而计算机系统发展到今天,一台计算机已经不仅仅是一个CPU这么简单了。以Power为例,我们来看看现在的“进程-CPU”亲和性有多少层。

(1) 进程运行在同一个逻辑CPU(即CPU 线程,x86的超线程或power的SMT)
(2) 进程运行在同一个CPU core(一个core可以有多个线程)
(3) 进程运行在同一个CPU chip(一个chip可以有多个core)
(4) 进程运行在同一个MCM(multi chip module,或者叫slot)(一个MCM可以有多个chip)
(5) 进程运行在同一个抽屉( drawer)(一个抽屉可以有多个MCM)
(6) 进程运行在不同抽屉

2.CPU和缓存之间的亲和性

上面提到,当内核需要切换到另一个进程时,需要把这些上下文从当前CPU切出去,保存在其他地方(CPU缓存或内存,内存也可以理解为是缓存的一种)。因此CPU与缓存之间也有亲和性的概念。

CPU本身有缓存,CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。并且CPU往往有多级缓存(L1、L2、L3),当上下文在CPU内部的多级缓存都找不到的时候,那就去最大的缓存-内存里面查找。如果CPU和缓存/内存离得非常远,那么此时亲和性就非常差。

还是以Power7为例,
(1) 进程运行在同一个CPU core,可以共享L1、L2、L3这3级缓存
(2) 进程运行在同一个CPU chip,只能共享L2、L3这2级缓存
(3) 进程运行在同一个抽屉,只能共享内存,或L3-L3之间的传递。
(4) 进程运行在不同抽屉,只能是内存到内存之间的传递。

CPU和缓存的亲和性最差的情况是,CPU在一个抽屉,而对应的内存在另一个抽屉,这种情况下,系统的运行将非常慢,必须调整CPU亲和性(后面介绍)。

虚拟化环境下的亲和性

在虚拟化环境下,操作系统看到的CPU是虚拟CPU(简称VP),操作系统的进程调度机制只能负责把进程调度到VP上,而至于进程跑到了哪个物理CPU上,操作系统的进程调度是不知道的。

在虚拟化环境下,Hypervisor层把物理CPU转换为VP提供给操作系统,虚拟CPU对于Hypervisor来说也是一个软件的线程。Hypervisor同时也负责保持虚拟CPU和物理CPU之间的亲和性。

虚拟化环境下的进程与CPU的亲和性因此分解为“进程和VP的亲和性”以及“VP和物理CPU的亲和性”(后面会介绍如何查看亲和度)。当一个LPAR的VP过多、EC过少时(例如EC=2,VP=20),有太多的虚拟CPU(其上承载着进程)需要调度到少数的物理CPU,因此造成上下文切换无比巨大,而丧失了Hypervisor层面的亲和性。

如果采用一些方法把某个进程绑定在某个CPU上,在虚拟化环境下未必能达到期望的效果。

查看“进程-CPU”亲和度方法

1. 获取来源

Nmon的BBBP sheet
命令行Mpstat –d

2. 举例说明

如图所示:

  1. 有92.7%的进程调度是在同一个逻辑CPU上完成的
  2. 有2.4%的进程调度是在同一个CPU Core但不同逻辑CPU上完成的
  3. 有0%的进程调度是在同一个CPU chip但不同逻辑Core上完成的
  4. 有4.9%的进程调度是在同一个MCM但不同CPU Chip上完成的
  5. 没有进程是在不同MCM上完成调度的
  6. 没有进程是在不同抽屉上完成调度的

查看“CPU-内存”亲和性方法

1. 获取来源

lssrad –av
Perfpmr的输出文件lssrad.out

2. CPU和内存在同一个抽屉


SRAD (Scheduler Resource Allocation Domain )
REF1是抽屉号
所有的CPU和内存都在一个抽屉,即共享了内存,不存在CPU和内存分在不同抽屉的情况。

3. CPU和内存分布在不同抽屉但仍有亲和性

CPU分布在4个CEC笼子中0、1、2、3

4. CPU和内存分布在不同抽屉(1)

资源分配域2中,从编号为1的抽屉中取了CPU但没有取内存。

5. CPU和内存分布在不同抽屉(2)

资源分配域4中,从编号为2的抽屉中取了内存但没有取CPU。

虚拟CPU与物理CPU的亲和度

1. 获取来源

在AIX上开trace,并后期用curt生成报表,可以看某个VP上,“进程/线程和虚拟CPU的亲和度”以及“虚拟CPU与物理CPU的亲和度”。

2. 指标说明

对于physical processor affinity这个值来说,理想的亲和度是1.0,即虚拟CPU总是被调度到同一个物理CPU,得到了最大化的缓存命中率,最差的亲和度是0。

如果一个分区需要的CPU资源超过了EC值,此时VP可能会到其他物理CPU上获得时间片,造成上下文切换。简单来说,也就是借来的CPU性能较差。

其他查看亲和度的方法

topas –M

topas可以查看亲和性,但只会区分出3级(local、near、far),而不是我们之前说的6级。并且,这3级(local、near、far)是计算机结构的不同而不同。定义不清晰,所以不建议采用。

svmon -O affinity

看每一个logical cpu的内存亲和度
结果中可以看到类似<MemAffinityPercent>100</MemAffinityPercent>。
这个方法用处不大。

下节预告

如何提高进程与CPU的亲和度、CPU和内存的亲和度、虚拟CPU与物理CPU的亲和度。

专栏其他链接
性能指标之资源指标 CPU配置参数对性能的影响
性能指标之资源指标 CPU利用率的性能分析
性能指标之资源指标 CPU亲和性调整优化
性能指标之资源指标 如何精确计算每笔交易消耗的CPU

微信公众号:性能测试与调优

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

6

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

作者其他文章

相关文章

相关问题

相关资料

X社区推广