PMU Event counter的使用状况检测

题目用中文反而有点绕,How to detect whether PMU event counters are occupied?

就是在前几天全民在家办公的时候,有个来自A公司的“大客户”发邮件咨询了类似的问题。事发他们正在开发一套基于PMU (performance monitoring unit)event counter的工具用于监控物理主机的硬件资源使用情况。但他们在开发过程中发现有些客户的某些应用同样也会使用到Event counter,导致Event counter的使用出现冲突,数据不可用。于是自然就需要一种event counter是否正在使用的机制。

PMU event counter(以下简称event counter)顾名思义其实是一个集成在硬件里的计数器,经过编程(或者“re-program”再编程)之后可以对某些系统的事件——比如执行的指令条数等——进行计数。使用者可以通过两次计数器的差值获得在此时间内对应事件发生次数,进而对整个系统的有了更好的了解。

回到那个痛点。基于硬件实现的event counter的数量其实有限(最新一代的CPU只有7个hw event counter),但可用的event的种类却远大于event counter的数量。如果这时候系统中出现两个进程访问同一个event counter且为该event counter指定不同的事件时,即出现了PMU event counter冲突。

X86平台对于这个问题的现实解决方法是MSR(Model Specific Register)“注册法”,简单来说就是:“你在用那个event counter提前说”。对于开发者来说官方给的建议可以参考Intel-SDM vol3, chapter 18.2的内容(注:该章节同时包含了比如event counter的溢出判等多种事件判断,建议PMU开发人员精读。)。这里就简单的说说如何检测哪些event counter被使用了,这里就牵扯到直接读取0x38F这个MSR,只有当返回值为0的时候才意味着没有其他的进程占用了event counter。

~# rdmsr -p <CPU core ID> 0x38F # rdmsr命令依赖于msr-tool安装包

本来呢,其实到这里就结束了,但考虑到很多时候,有些进程或者说PMU工具并不是遵守了“谁使用谁注册的方式”——我自己不止看到过一种(开源)工具不检查、不注册直接上手program event counter的!或者还有一种情况就是有些PMU的工具并不是安全退出(强行被kill)的。那造成的结果就是没有更新event counter的注册信息。这种rdmsr方式只能针对更“守规矩”的event counter使用方式。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据