应用程序状态切换检测

任何一个合理的应用程序的运行时间内,微观上都会存在或多或少的“状态切换”。所谓状态切换的定义就是在用户可感知的特征变化。可感知的特征可以理解为对各种资源的需求变化的特性。
有点绕,举个简单例子:一个SQL数据库,在只有一个用户连接的时候,每次用户的访问都会出发一个状态切换事件,而当用户使用长连接(pipe line)去执行多个SQL命令时,由于SQL的不同,每个SQL之间就是一个状态切换。

对于用户自己的应用程序来说,就比如上面例子中的SQL DB,每次的状态切换用户自己是知道的。比如你要准备做某个DB表维护,你可能会提前检查磁盘空间,这就是一个典型的资源分配确认的流程。而对于虚拟机的应用场景来说,对于虚拟机的托管商是无法通过类似的方式正确的理解每个租户的用户行为的。然而在超售成为必然的云计算行业中,理解用户行为是非常重要的(自黑:正如本站自从使用了云计算服务托管之后,总是会出现莫名其妙的卡顿)。那是不是存在一个方法可以允许主机平台直接可以检测到应用程序(虚机)的状态切换呢?

有一个方法是通过CPU指令中内存的读写变化来区别每个状态的切换。通过Linux的perf命令,我们可以拿到load instrucation/store instruction两个指标。而这两个指标的微分(斜率)变化既可以直接获得状态切换。

dcat 状态切换检测

我们的在虚机中通过简单的批处理依次执行了3个常见的应用模拟虚机租户的状态变化。上面包含了两个曲线图,上图为IPC(instruction per cycle),下图为load instruction/store instruction的两个曲线以及他们的斜率(点阵)混合图。

区间1-2为一个矩阵计算,区间3-4为内存搬运压力测试,其中包含了3个相同的周期,区间5-6为文件压缩测试。从测试结果上来看,每个状态的切换都可以很好的被检测出来。

如果你之前有过一定的性能分析经验,你可能会提出疑问:“为什么不直接使用IPC的变换来确定应用程序的状态切换?” Litrin自己也曾经有过这个疑问,但IPC的变化相对来说是一个更加连续线性的过程,正如1-2区间内,IPC的变换是连续的下降;剩余的状态切换IPC的变化程度远没有load/store instruction的变化来的剧烈。而这种状态切换检测的依据就是要找到一种“不连续”的曲线来。所以尽管IPC是一个更加常见的性能指标,获取代价也更加低廉,但它并无法准确的反映出状态切换的整个过程。

推荐阅读:
5月中旬,我参加了在加利福尼亚
讲点关于工程师的理念和哲学吧。
在虚拟机的日常使用和开发中,我

发表评论

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

请补全下列算式: *

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