Diffprof

Posted by Maxul's Technical Notes on October 16, 2018

题目: Differential Energy Profiling: Energy Optimization via Diffing Similar App

作者: Abhilash Jindal and Y. Charlie Hu

单位: Purdue University and Mobile Enerlytics, LLC

出版: OSDI 2018

总括:

  • 已有的app能耗剖析工具在静态代码层面寻找能耗热点。
  • 可惜的是,给出了能耗较大的关键部位,开发者却对接下来的优化无从下手:是否存在更省电的实现?怎么实现呢?
  • 本文的目的就是在应用市场中寻找更高效更节能的应用实现,方案是“差分式能源剖析”。
  • 实现的DIFFPROF对安卓市场的8组app(每组5个)做了剖析,这个工具可以指出低效的部分,并展示出对应的调用树,方便开发人员快速明白耗电背后的原因,方便其找出解决方案!

解决问题:

续航能力是移动端用户体验的关键!Apple 和 Google 鼓励开发者优化他们的Apps。

传统优化周期是:在静态代码上找到能耗热点,思考如何重构这部分实现。(疑问:何不在运行时做,需要新型Monkey去触发分支吗?

但事实是:应用代码量大,第三方插件多,甚至运行过程中和OS交互频繁。没有自动化工具,这个问题很难!

有那么几个工具可以帮助开发者快速找到能耗热点,但是开发者知道后还是不知道如何调优。万里长征未还!

本文希望自动找出更有效的实现,不仅告诉where,还能告诉你how(显然程序分析的套路)。

思路:控制变量法,类似功能的app(聚类),相同的任务(功能),不同的开发者(实现),导致 energy footprint 的千差万别。

挑战:

  1. 差分的粒度如何控制?任务粒度,那么如何定义任务?
  2. 如何标记出差分单元?在源码中标记出调用树,将任务的 manifest 转化成Erlenmeyer flask-shaped slice,表示为3元组<调用路径,框架方法,子树节点>,分别对应<任务上下文,service,特定执行路径>
  3. 如何完成这种差分运算?一种有效的匹配算法,优势是其他工作找到不那么高效的地方,这个工作找到低效而且是实现的具体细节,帮助开发人员找出解法。

贡献点:

提出基于差分的能源剖析方法; DIFFPROF,针对安卓应用的能源优化工具。

观察:

  1. 同类型不同实现的app之间能耗差异较大(这才能找出较优解):原文表1
  2. 能耗主要花在框架服务层(可见不是各家实现不同造成的,很有可能是框架的“打开方式不对”):原文图1
  3. 类似功能的实现下,任务有很大重合度,对系统服务框架的使用方式决定了能耗:表3和表6

缺点:

  • 只能给有源码的app做剖析!

思考:

  • 可否在无源码二进制上完成?二进制更优方案可否嫁接?
  • 可否用虚拟化,利用Intel PT实现运行时判断,或静态分析检验?
  • 可否迁移学习故障诊断漏洞分析等领域?

相关工作:

  • EPROF 实现源码层面能源的剖析和审计;ARO是针对网络的跨层剖析;Wattson在开发者工作站上用模拟器评估app能耗;GfxDoctor评估每次UI更新时框架渲染层消耗的能量。本文在这些工作的基础上,进一步帮助开发者理解如何优化代码,而非只是指出所在。
  • Diffing这种方案在行为差异化分析、分布式网络的misconfiguration/性能异常/故障诊断等都有应用。