Last update 201906016
做些铺垫
当今嵌入式设备OS系统优化面临的挑战难题有:
- 造成发热,卡顿,待机时间差的主要瓶颈是什么?
- 当设置内核,JVM,资源管理功能的参数时,到底该怎么设置才合理?
- 如何全面的评估某个算法的优化效果?
想要回答上面几个问题,目前的做法是根据几个有效日至或者通过本地复现的手段来寻找线索。虽然可以回答问题,也有理有据,但他的准确度是值得怀疑的。 最根本的原因是样本量太少!
以问题3为例,假设是在评估某个CPU Affinity分配算法。可以通过单个或多个的benchmark结果来评估算法效果,但还是有可能发生“不知道的不知道”。
为了避免发生“不知道的不知道”,我们可以采用如下方法:
- 构建实验组与对照组,通过对比实验的方式量化优化效果。评估单维度指标,也可以同时评估多个维度的指标变化。
- 量化不同算法下的系统主要瓶颈变化,用于排除优化一个场景反而带来另一个场景的性能降低。
为了实现方法1,2,我们应该具备如下能力:
- 低负载的多维度数据监控与存储器。
- 大数据分析能力。
- 全栈业务领域知识。
数据科学
那我们怎么才能系统化的建设这方面能力呢?下面引申出本文章的主题,数据科学。
Data science is a multi-disciplinary field that uses scientific methods, processes, algorithms and systems to extract knowledge and insights from structured and unstructured data. - 维基百科
这里的关键词是 scientific method,extract knowledge and insights。使用科学的方法,从数据中获得洞见。随着大数据技术的完善与普及,通过利用大量采集而来的数据来认识事物本质成为了可能。而我们习惯的思考模式是从个别现象中寻找共性,然后再用大量事实来验证此共性是否准确。 第二种方法进展缓慢,且成本也大。但第一种就不一样了,随着数据的存储跟计算越来越便宜,我们可以直接使用数据获得有用的洞见。
若想成功应用数据科学,需要兼备如下多学科知识跟技能:
- 概率与统计学
- 机器学习
- 业务领域知识
- 计算机科学
- 代码编程
- 数据可视化
- 表达与沟通
应用数据可学的步骤
针对系统优化领域,我们应该怎么使用数据科学方法获得洞见呢? 我认为以下6个步骤是必须的,而且严格按照顺序执行:
- 定义分析目的
- 定义有效的评估指标
- 数据收集器的设计与实现
- 根据分析目的,选择对应的分析模型来分析数据
- 寻找洞见
- 根据洞见反推设计,并得到改善
[步骤1] 定义分析目的
分析目的不同设计的指标与分析方法也不同,常见的分析目的有:
- 趋势观察
- A/B Test
- 异常时问题分析
- 瓶颈分析
- 异常预警
[步骤2] 定义有效的评估指标
这步骤主要考验领域知识的掌握深度,因为指标的主要来源以及服务目标就是来自于业务。指标定义要优先于优化方案评估,目的在于你的优化方案要为指标的优化而努力。这时候指标更像是一种优化目标的量化方法,如果优化目标无法量化也意味着你的不明白你到底要做什么。 好指标应当结合业务需求,技术需求的不同角度来综合设计。 比如谷歌的WSMeter指标,阿里数据中心的WorkDone指标。通过思考指标的定义,也促使自己思考优化的方向。一个好的指标,像个灯塔一样,非常准确地指引着优化目标,而一个坏的指标往往会导致顾此失彼的结果。
提到指标,就不得不提到北极星指标(North Start Metric),又被称为唯一重要的指标。它是用户增长领域里的概念,意指像北极星一样高高闪耀在天空中,指引着全公司上上下下向着同一个方向努力。虽然关注领域有点不同,但是所要达成的目标是一致的,即能够准确量化最关键的业务目标。读者可以感受下制定北极星指标时需要遵守的几个标准:
标准1:你的产品的核心价值是什么?这个指标可以让你知道你的用户体验实现了这种价值吗?
标准2:这个指标能够反映用户的活跃程度吗?
标准3:如果这个指标变好了,是不是能说明你的整个公司是在向好的方向发展?
标准4:这个标准是不是很容易被你的整个团队理解和交流呢?
标准5:这个指标是一个先导指标,还是一个滞后指标?
标准6:这个指标是不是一个可操作的指标?
[步骤3] 数据收集器的设计与实现
收集器需要参考指标的定义来设计,有些数据的采集难度或者成本较高,这时候可以通过巧妙的指标来弥补这部分缺点。有时候因为现有机制缺少相关的数据提供方式,需要单独实现一套高效率的收集机制,特别是牵涉到内核级别的数据时往往都会采用定制方法。
综合来说主要原则有两个:
- 数据能够准确的代表业务,这是基础中的基础。
- 收集数据时工作负载要小,需要控制在一定影响范围内。如果无法保证性能的话需要采用发布策略在尽可能不打扰用户的前提下抓取数据。
- 数据能完整地涵盖业务变化,宁可多收集一些冗余数据但不能容忍有遗漏。
[步骤4] 根据分析目的,选择对应的分析模型来分析数据
为了达成有效的数据实验,需要熟悉各种数据挖掘技术(算法),除了工作原理之外还有就是他们的最佳应用场景。根据分析目的为分类的话:
1:分析目的为趋势观察时:
只需要将收集上来的数据进行ETL之后使用可视化工具展示就可以了,这里的难点在于可视化图表的选择上,选择原则为:
- 尽量使读者看图知意,不需要过多的猜测与思考以免造成误解。
- 可视化图表需要展示完整的数据。
2:分析目的为异常分析时:
基本以非结构化数据为主,分析主要结合领域知识跟专家系统做分析平台。经常会被产品化团队当做主要分析目的使用。
3:分析目的为瓶颈分析与异常预警时:
基本以结构化日志为主,使用的算法主要来自机器学习领域。
常见的数据挖掘技术有:
- 决策树(Decision Tree)
- 神经网络(Neural Network)
- 回归(Regression)
- 关联规则(Association Rule)
- 聚类(Clustering)
- 贝叶斯分类方法(Bayesian Classifier)
- 支持向量机(Support Vector Machine)
- 主成分分析(Principal Components Analysis)
- 假设检验(Hypothesis Test)
[步骤5] 寻找洞见
这一步重点在于使用业务知识来解读步骤4中生成的数据结论。从经验上来看,往往决定胜负的并不是数据挖掘技术,而是来自于对业务的深刻理解上。这时候数据结果起到辅助判断的作用,所以万不可盲目崇拜数据技术而不重视业务知识。特别需要注意的是当业务专家与算法计算结果发生冲突的时候,这可能是一个潜在的优化点。
[步骤6] 根据洞见反推设计,并得到改善
前面的努力都是为了这一刻,从步骤5中获得的洞见将会指导我们重新审视现有的方案,或者验证我们的猜想。这一步是我们的终极目的,只有反哺到了现有业务,才是真正有效的一次数据应用实践。但这并不意味着结束,通过此步骤得到结果,我们可以发起下一轮的实验,即返回到了步骤1。
写在最后
- 人的认知提升是一个螺旋上升的过程,不要指望一把命中目标,我们应该具备的思维方式是迭代式改进的思维模式(或者说是演化思维)。在后果可控的前提下可以犯错,可以做实验,这一次实验是要站在前一次实验的基础上。通过这种方法不敢保证一定会成功,但它是成功概率最高的一种做事方法。
- 理论知识往往都很好学,很好理解,难点就在于时刻把理论应用到现实中,从现实中验证理论。有点像学习经济学思维一样,他并不要求你能背诵多少个经济学名词,反而更关心经济学规律如何在现实中得到应验,以及如何使用规律构建规则使社会运行效率最大化。
- 未来是属于数据间的竞争,而数据竞争的源头来自于指标的定义。一个好的指标定义很大程度上决定了,通过数据科学的方式优化业务的效果,务必要给予高度重视,需要时刻反思指标的正确性。
- 经济学原理指出,当交易成本近乎为零时,谁更能利用好资源,那资源就归谁。同样道理,数据本身只是存储在服务器里,谁能挖掘到洞察,谁就得到金子。
Reference
- 张溪梦:首席增长官:如何用数据驱动增长
- 卢辉:数据挖掘与数据化运营实战:思路,方法,技巧与应用