简介

APM - iOS 卡顿监控 Hang

Hang

APM - iOS 卡顿监控 Hang

APP一段无呼应的阶段,因为主线程忙于其他使命或许等候其他线程或许体系资源,导致视图内容更新推迟至少250ms

Main Loop

APM - iOS 卡顿监控 Hang

用户与设备进行交互,Runloop接纳事情,处理事情,有需求的状况下更新UI,这些都产生在主线程runloop的一圈中

APM - iOS 卡顿监控 Hang

处理时刻比较久的状况下,用户输入和UI更新之间就会产生推迟。更差的状况下,当hang产生的时分,事情被堆积起来而主线程无法处理

APM - iOS 卡顿监控 Hang

hang的影响在不同的场景下造成的影响也不同。一般超越1秒的推迟总是会被看成是hang,不过更短时刻的推迟也会。比如在滑动过程中,0.5秒的推迟用户体验就很不好了,但是转场中就不会这么明显

Hang的原因

APM - iOS 卡顿监控 Hang

  • 主线程本身繁忙
    • 一个单次长使命
    • 多个短使命
  • 主线程被其他线程或许体系资源Block住

主线程繁忙

履行多余的工作

APM - iOS 卡顿监控 Hang

履行不相关的工作

APM - iOS 卡顿监控 Hang

主线程阻塞

I/O

主线程读取需求等候其他线程写入完结

APM - iOS 卡顿监控 Hang

Synchronization

主线程等候其他线程开释锁

APM - iOS 卡顿监控 Hang

获取不常变的数据

在存储器的层级上,在部分体系API的获取上,存在较大的速度差,这种状况下需求缓存数据,不能在主线程中重复获取这类不会经常变化的数据

获取联系人

APM - iOS 卡顿监控 Hang

拜访体系资源

APM - iOS 卡顿监控 Hang

监控和确诊

APM - iOS 卡顿监控 Hang

  • 开发阶段能够使用Performance Checker,Instruments
  • Beta阶段能够敞开设备上Hang检测,或许使用MetricKit
  • 发布后能够在Xcode Reports Organizer对Hang进行监控

开发阶段

System Trace

红线标识了体系调用,紫色图形标识了虚拟内存缺页,水平蓝色区域标识主线程正在繁忙。在Profile中找到对这4.7s阶段的主线程仓库聚合

APM - iOS 卡顿监控 Hang

Time Profiler

iOS 16, Xcode 14

经过持续显现使用的调用栈,标识了使用当时正在履行的内容

APM - iOS 卡顿监控 Hang

Thread Performance Checker

iOS 16, Xcode 14

APM - iOS 卡顿监控 Hang

检测优先级反转和主线程履行非UI使命

APM - iOS 卡顿监控 Hang

Beta测试阶段

On-device hang detection

iOS 16, Xcode 14

在设置 > 开发者 > Hang检测中,阈值有250ms,500ms,1000ms,2000ms几个选项。供给了实时的Hang告诉,支持在在开发者签名的包和TestFlight包中确诊

对于Hang的检测是在后台以最低优先级的使命运转,用于最低极限的最小化对功能的负载影响,如果体系处于繁忙状况的话,则履行得会更久一些。有新的确诊可用的时分,告诉会议示出来

APM - iOS 卡顿监控 Hang

发布阶段

MetricKit

这个库能够收集来自单一用户在Beta或许线上发布的APP中非聚合的 hang率目标和确诊陈述

此处发现在获取联系人的函数导致的hang的问题

APM - iOS 卡顿监控 Hang

Xcode Organizer

iOS 16, Xcode 14

在Organizer东西中能够看到依照app version,日期,iOS体系版本分布的图表化信息,其间包含率Hangs的相关目标

选择Hangs选项

APM - iOS 卡顿监控 Hang

其间也包含了关于Hang的仓库信息详情,需求上传对应的符号表用户符号化仓库信息

APM - iOS 卡顿监控 Hang

能够经过App Store Connect REST APIs来拜访Xcode Organizer中的数据内容,这样能够更好的跟开发者自建的体系集成或许添加额外的分析

Xcode 13.2开端Xcode Organizer中能够接纳到关于监控功能目标的告诉,主张打开告诉开关,能够更好的接纳告诉用于预警例如Hang目标忽然添加的状况

消除Hang

削减主线程工作

Caches

因为不同层级存储器拜访速度不同的问题,由其主线程或许他线程拜访数据之后,缓存到高速拜访存储器,之后主线程拜访能够节省大量的时刻

APM - iOS 卡顿监控 Hang

Observers

观察者这种方式能够让主线程只关心数据或状况的变化,而不必进行昂贵开支和按需核算

APM - iOS 卡顿监控 Hang

移除主线程工作

Asynchronous API

许多非要害的使命能够交给低优先级的线程完结,即使需求多花一些时刻,主线程能够专注于其他要害使命

APM - iOS 卡顿监控 Hang

GCD

异步使命并行行列能够很好的开释主线程的资源,履行完结之后能够回主行列回主线程履行UI更新等操作

APM - iOS 卡顿监控 Hang

引用

Track down hangs with Xcode and on-device detection

Understand and eliminate hangs from your app

Apple Document Improving app responsiveness

Analyze hangs with Instruments

引申

WWDC16 – System Trace in depth

WWDC17 – Modernizing Grand Central Dispatch Usage

WWDC19 – Improving battery life and performance

WWDC20 – Identify trends with the Power and Performance API

WWDC21 – Diagnose Power and Performance regressions in your app