起因
为什么会考虑到想自研APM呢?对于我们软件的开发流程中我发现大家都聚焦于代码的质量,需求的准确性和稳定性,很容易忽视关于性能方便的要求。当然在硬件条件越来越好的时代,我们还有必要关注性能嘛?答案是当然的:有必要 而且很有必要。现在一个App的业务繁多,一个超级App可能大大小小可以供用户使用的需求能达到上千个,常用的页面涉及到几十个。如果每个需求哪怕只有一点的性能浪费积累起来就会给用户产生一定的影响。代码质量我们可以CodeReview、 静态检测,需求的准确性和稳定性我们可以通过测试。那么性能方面我们是不是也可以通过一定方法进行检测和监控?
那么何为APM? 这边引用一段百度百科的介绍:
在信息科学和系统控制领域,APM致力于监控和管理应用软件性能和可用性。 通过监测和诊断复杂应用程序的性能问题,来保证软件应用程序的良好运行(预期的服务)
所以说,APM就是一个检测应用性能的工具,简单的说就是上线了的App卡不卡,好不好用。
题外话:最近复联四很火,钢铁侠是我最喜欢的角色 里面有个贾维斯的人工智能系统,如果有一个监控系统能够
监控整个App性能和稳定性和贾维斯一样那一定会很有意思。
那么好的APM应该有那么功能?性能指标又有哪些呢?或者是能帮开发者做到什么事情呢?
APM应该有哪些功能?
性能统计
内存/CPU
比较基础的性能参数,之前的文章也谈论过。获取难度不高。
启动时间
剖析整个App启动流程,具体方法可以参考这里。
FPS
做法比较通用的就是利用CADisplayLink,因为比较常见这里只贴出相关核心代码
@implementation YYFPSLabel {
CADisplayLink *_link;
NSUInteger _count;
NSTimeInterval _lastTime;
}
- (id)init {
self = [super init];
if( self ){
_link = [CADisplayLink displayLinkWithTarget:[YYWeakProxy proxyWithTarget:self] selector:@selector(tick:)];
[_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
}
return self;
}
- (void)dealloc {
[_link invalidate];
}
- (void)tick:(CADisplayLink *)link {
if (_lastTime == 0) {
_lastTime = link.timestamp;
return;
}
_count++;
NSTimeInterval delta = link.timestamp - _lastTime;
if (delta < 1) return;
_lastTime = link.timestamp;
float fps = _count / delta;
_count = 0;
}
值得注意的是基于
CADisplayLink
实现的 FPS 在生产场景中只有指导意义,不能代表真实的 FPS,因为基于CADisplayLink
实现的 FPS 无法完全检测出当前 Core Animation 的性能情况,它只能检测出当前 RunLoop 的帧率。
卡顿监控
待整理
网上较多的方法一个是监控Runloop 一个是ping主线程。开源的微信matrix 可以借鉴一下。
页面加载耗时统计
网络监控
待整理
Flex的网络模块做的挺好的。
帮助开发者做什么?
有了这么多数据我们能利用这些做什么呢?
- 开发阶段
能在开发过程中将可疑的问题暴露出来,提前发现提前解决,避免将隐患带到线上。
- 测试阶段/性能测试报告
开发经常是debug状态,难免不正确,自己单测一个需求也不是很全面,测试的介入可以加大找到问题的概率。
- 上线时期/服务端监控/通知开发者
上线后及时分析各个业务的运行状态,不要等到用户大面积出问题才开始解决。而且这种时候如果没有足够的数据,用户提供的信息也比较少很难定位问题。
总结一下:
总体来说想要完成一个APM还是比较难的,除了实现该有的统计数据,还要避免集成性能工具带来的而外性能开销。统计完之后也要有合适的策略进行上报操作。拿到数据后服务端要怎么利用这些宝贵的数据给稳定性做支撑这些都是非常值得思考和研究的事情。
写在最后:
Better Late Than Never ,愿我们都能跨出自己的第一步。
站在巨人的肩膀上,感谢前辈们的文章。
参考链接:
https://github.com/aozhimin/iOS-Monitor-Platform
https://tech.meituan.com/2016/12/19/hertz.html
http://www.cocoachina.com/ios/20170804/20145.html
http://m.quzhiboapp.com/?#!/intro/392
https://www.jianshu.com/p/8123fc17fe0e
https://mp.weixin.qq.com/s/MwgjpHj_5RaG74Z0JjNv5g