Keke Yezi

Better Late Than Never

我是叶斌 (Kekeyezi) 就职国泰君安.


Coding & Game & 初级奶爸

APM设想

起因

​ 为什么会考虑到想自研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的网络模块做的挺好的。

帮助开发者做什么?

APM.001

有了这么多数据我们能利用这些做什么呢?

  • 开发阶段

能在开发过程中将可疑的问题暴露出来,提前发现提前解决,避免将隐患带到线上。

  • 测试阶段/性能测试报告

开发经常是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

https://wereadteam.github.io/2016/12/12/Monitor/

https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ==&mid=2650400312&idx=1&sn=ce8468991c70ab2e06634f59cd2b6865&chksm=83952e20b4e2a736f701853a483da535312a258a56ca87d65b8ef77e8cf012dab9145659a0aa&scene=0&key=459eeebe1b51063320bc30b7024529048032de1a4d3a8e7cf01dbfc995da8f74fe85688c8be0471b1fdcb82d9b875d163a62f42e9ca04946e2c899194097fb93632ca7790f6fb7395d897442b9272213&ascene=0&uin=MTY3NzkzNjI0NA%3D%3D&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.12.2+build(16C67)&version=12020010&nettype=WIFI&fontScale=100&pass_ticket=JE5tAT8H%2BfKdFzHQq72mWMIv%2BitHWOqOma3xmX5OeGGPWz2mPXxz3kaQE1WSKJlw

最近的文章

iOS CodeReview

代码质量是每个技术团队都很重视的一点,但是人员变动,开发人员水平层次不齐,需求细节不完善,开发周期紧张等等一系列问题都可能拉低代码质量,给我们的APP带来很多风险。CodeReview就是提高代码质量的手段之一。这周参与了3次不同模块的CodeReivew,趁热总结一次完善的CodeReview要经过哪些流程。准备 会议室预定+时间确定。安静的环境, 没有特别紧急的事情要处理的时间才适合CodeReview不然关键人员一会会就出去了很打断流程。 人员邀请。确定被Review人 和 需要...…

CodeReview继续阅读
更早的文章

iOS App Optimization series 4 耗时统计

对于耗时统计作用最有价值的莫过于以下几点 启动时间优化关于启动时间优化之前有文章分析过,如果没有心情细看可以直接使用最终方案。起点时间+ (BOOL)processInfoForPID:(int)pid procInfo:(struct kinfo_proc*)procInfo{ int cmd[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid}; size_t size = sizeof(*procInfo); return ...…

优化继续阅读