我注意到一个现象:好几个同事在反馈 App 卡顿的时候,描述都是"感觉有点卡"“发热挺明显的”,但问到具体是 CPU 高还是内存吃紧,又说不上来。性能问题定位的第一步其实是先把量化指标拉出来,看数据说话。

CPU 占用:看的是单进程还是系统总负载

CPU 监控里有个容易误解的地方:iOS 设备是多核架构,单进程最大占用率可以超过 100%。比如 A15 芯片 6 个核心,一个进程跑满所有核心会显示 600%。所以看到 200% 不代表异常,只代表用了两个核心的资源。更有参考价值的是系统总 CPU,反映整体负载——如果某个操作过程中总利用率持续超过 80%,同时 App 出现卡顿,那 CPU 可能就是瓶颈。

用 KeyMob 看 CPU 数据时,在指标下拉框里勾选 CPU,点击"选择 App"选目标进程,然后勾选"系统总 CPU"做同屏对比。曲线图会实时显示两条线的变化关系——如果 App 进程占用不高但系统总 CPU 很高,问题可能出在其他进程或系统服务。

内存:关注点不在"剩余多少"

iOS 的内存管理和 Mac 不太一样,剩余内存为 0 不代表有问题,系统会自动清理闲置进程。更需要关注的是两个指标:一是 App 占用内存是否在退出页面后回落——如果持续增长不释放,大概率有循环引用或未释放的资源;二是交换内存的频率,频繁交换意味着物理内存吃紧。

选 App 进程后勾选"内存监控"就能看到已用内存、剩余内存、交换内存和 App 占用的实时曲线。

GPU 和帧率:两个指标配合看

FPS 反映画面流畅度,60Hz 设备上限 60 FPS,ProMotion 设备上限 120 FPS。FPS 掉到 30 以下基本就是严重卡顿。但只看 FPS 可能漏信息——帧率高但帧提交时间不稳定,实际体验还是会觉得一顿一顿的。这时候配合卡顿检测一起看会更准确,卡顿检测追踪的是每一帧的提交延迟,能捕捉到 FPS 看不出来的丢帧问题。

GPU 监控方面,设备利用率超过 90% 通常意味着渲染压力大,检查是否有多余的 OverDraw 或复杂的 Shader。Tile 利用率持续超过 85% 可能需要优化纹理压缩格式。

网络和磁盘 I/O

网络监控主要看上行下行流量和数据包收发量。比如 App 在后台持续有上行流量,可能是某个 SDK 的心跳包间隔太短。磁盘 I/O 监控能定位读写频繁的场景,对排查启动慢或数据加载卡顿有帮助。

几点实操建议

监控前关闭其他性能工具,重启设备让后台进程干净。无线连接时关闭自动锁屏。数据可以保存为 JSON 文件,后续用性能历史模块加载回放对比,跟踪版本迭代前后的变化。