什么是PMU/PMC?
PMU是性能检测单元,PMC是性能检测计数器
PMC/PMU是目前实现软件性能调优、系统健康监控以及计算机资源计数等多种性能-功耗(PnP)领域数据采集的基础。
TSC是CPU当前的时钟数
如果你需要通过PMC监控CPU的利用率,那就至少需要:
- 指定两个PMC硬件计数器,在同一个时间段内通过硬件的计数器绑定这两个PMU事件。
- 读取计数器,类似“查水表”获得这个时间段两个计数器的值,与上一个值比较,获得本周期增量。
- 通过上面的表达式计算本周期的CPU利用率。
- 等待一个相对固定的时间(刷新率)。
- 跳回2,直到监控结束。
PMU的分类
按照现在主流x86的架构,目前PMU可以区分为:
- Core PMU 事件、计数器:跟随CPU计算核心的PMU,事件发生在系统n个核心的一个或几个核心上。core 事件
- Uncore PMU事件、计数器:由于现代x86多核CPU的L3cache,PCIe,memory controller等组件都是在插槽级别共享的,所以这部分的事件不会跟某个CPU核心的操作联系起来。
不同类型的事件只能通过与其对应的计数器计数。Uncore这部分由于各个组件之间本身又是相互独立的,又被按照功能的不同被划分了多个子分类。
通用PMC和专用PMC
按照本文优先从core PMU讲起的话,core PMU根据功能或者说使用方法的不同又分了通用 PMC和专用(fixed) PMC。
通用PMC的编程
理论上通用计数器可以被编程绑定任何一个已经定义了的PMU事件
专用PMC的编程
Fixed PMC编程方法则完全不同,首先每个PMC默认已经绑死了某个事件,如果需要采集对应的数据则直接写入MSR:0x38d去实现。
计数器复用
正如一开始的例子描述的:通常情况下,一个性能指标往往由多个PMU事件组成,即如果需要正确的监控某个性能指标,往往需要同时使用多个PMC。于是受限于硬件PMC的数量,某些情况下我们必须要对监控的性能指标规划复用。
- 针对多个相对独立的性能指标,往往可以考虑采用时分复用的方式分别采样其中某个指标的多个事件。比如A,B两个指标,首先采样A,在下一次context switch之后采样B……依次循环。
- 针对相对具有关联性的性能指标,可以考虑将多个指标合并成一个组同时采样。比如A由a,b两个PMU事件组成,B由b,c两个事件组成,那不妨将a,b,c同时取样。
- 针对相对平稳、单一且可重复的任务负载(比如各种CPU压测工具)不妨通过多轮采样的方法。此种方法并不一定适合适合采样时序数据。
- 对采集的数据通过数学上的统计法、数值填充这类的方法在某些要求不高的情况,比如线上资源监控,容量预估等场景。