对于前端来讲,最重要是的体验,而在前端体验中,最为核心的就是性能。秒开率、流畅程度等一系列指标都直接影响用户体验。css
所以,创建一个准确、及时、有效的前端性能监控系统,不只能够量化当前页面的性能水平,还能够为优化方案的效果提供数据支持,此外,还能够在页面性能下滑时提供报警服务,提醒开发人员改善页面性能。前端
在参考前人的实践成果后,咱们对性能监控的一系列指标的计算成本,适用性和实用价值进行了评估,认为如下指标和信息是最具实用性和性价比的:python
首先是 fcp(first contentful paint,以下图所示),这个指标是目前统计页面秒考虑的主流指标,虽然它不如 fmp(First Meaningful Paint、lcp(Largest Contentful Paint)、speedIndex 等指标更贴近用户真实使用体验,可是优势是在 Android 端经过调用 Performance API 便可得到,在 iOS 能够经过 raf(requestAnimationFrame)估算,实施过程简单。web
其次是 tts(time to server),这个指标并无出如今此前看到的文章里边。数据库
它描述的是用户链接到服务器的时间,经过 Performance API 中提供的 requestStart 减去 fetchStart 获得,这个指标不是前端能够经过技术能够优化的,可是它能够反映在当前用户群体的网络环境下,页面秒开率的上限是多少。后端
举个例子,假如经过性能监控数据发现,有 15%的用户访问,须要花费至少 1s 的时间才能链接到咱们的服务器(能够是 SSR 服务器,也能够是 CDN),那么这些用户不管如何都不能秒开,那么此时,某页面秒开率的上限就是 85%。浏览器
假如当前状况下,这个页面的秒开率已经达到了 75%甚至更高,那么继续优化的边际收益会很是低,应该适可而止了。服务器
第三是 tsp(time for server processing),这个指标也没有出如今此前的参考文章里。微信
它针对的是在使用 SSR 的场景下,服务器内部处理页面请求的耗时,可经过 Performance API 中提供的 responseStart 减去 requestStart 获得。网络
这个环节性能太差,亦会成为拖累秒开率的一个瓶颈,因此必须予以监控;tsp 太长会压榨其余环节的性能预算,过小会增大服务器运维成本。
第四是 css 文件、图片等资源的大小、xhr 请求的持续时间,前两种资源若是不加节制,会致使页面即使作到秒开,也没法快速进入可用状态,好比常见的 feed 流页面。
对于 xhr,须要进行分类讨论,若是是 SSR 页面,则影响不大,只要保障 tsp 处于较低水平,基本上不会拖累秒开率,但若是是 SPA,页面主要功能区都依赖后端数据支持的,好比判断权限、展现 feed 流内容,xhr 的响应速度就很是关键了,也须要予以监控,在指标下滑时,通知后端予以优化和处理。
最后是一些环境信息,好比用户实用什么品牌和型号的手机,是在微信、浏览器、仍是咱们的哪一个版本的得物 App 内打开 H5 页面。
当页面的性能出现问题时,这些辅助信息能帮助咱们尽量精准地复现用户的实用场景,高效、准确地解决问题。
整个系统由如下模块构成:
SDK:负责采集用户的页面性能数据和基本信息,按照必定的发送策略将性能数据发往 SLS,植入页面后能够自行采集性能数据,不须要和页面代码交互。
SLS:阿里云日志服务,接受 SDK 发送的数据数据,并为性能数据添加接收时间,ip 等附加信息。
Backend:性能数据后端服务,这个模块有两个功能,一个是定时从 SLS 拉取原始的性能数据,对其进行去重和加工,获得性能指标数据和用户信息数据,而后将这些数据分门别类地存入对应的数据表中,以备查询。另外一个是为数据可视化提供接口数据。
DB:持久化处理后的性能日志数据和性能指标数据的数据库。
Report: 性能数据报表,经过和操做报表,观察特定项目、版本下的指定页面的各项性能指标。
各模块关系以下图所示:
在进行开发以前,须要对系统的几个关键点进行思考和决策。大体有如下几个点:
目前的前端性能监控系统能知足平常的监控需求,可是还能够更进一步:
文|老狼
关注得物技术,携手走向技术的云端