Anytrace线下性能归因
如果无法正常显示,请先停止浏览器的去广告插件。
1. APM线下性能归因实践
(Anytrace)
字节跳动 / 刘成清
2.
3. 课程收益
“降维” 分析App性能
iOS “后⻔” 服务
常⻅性能问题归因手段
4. 大纲
1. 线下工具的前世今生
2. 性能归因的降本增效
3. 原理分析
4. 总结回顾
5. 线下工具的前世今生
真实用户
Cloud
线上 APM平台 业务埋点
线下 PC工具 Debug SDK
性能归因
内部模拟
用户
自动化测试
6. 线下工具的前世今生
7. 线下工具的前世今生
采集
生产
天
专家
分钟
小白
消费
+
归因
8. 线下工具的前世今生
自动归因
消费
数据展现
Perfetto
采集
生产
ADB
Instru
ments
kTrace
人工
早期
Appiu
m
Monkey
现在
ADB kTrace
Bytest FastBot
?
9. 线下工具的前世今生
?
&
t1
t2
t3
t4
main
method1
method2
block
t5
t6
10. 线下工具的前世今生
直接定位原因
基于发展史,我们需要什么样的线下工具
?
数据足够详细
尽可能图形化数据
没有使用⻔槛
图表简单易读
减少使用限制
11. 大纲
1. 线下工具的前世今生
2. 性能归因的降本增效
3. 原理分析
4. 总结回顾
12. 性能归因的降本增效
Store
13. 性能归因的降本增效
部⻔:70+
疑难问题:25+
14. 性能归因的降本增效
消费
采集
数据生产
清洗&聚类
卡顿 内存 电量
火焰图&调用栈 引用树 图表联动
DXTMsg ktrace MemoryGraph AppleSmart
Battery
ADB profilo Rapeal Thor
自动化测试
人工测试
Fastbot
15. 归因的降本增效
卡顿问题
哪里发生卡顿?定位到代码
为啥导致卡顿?辅助信息
• 线程快照
• 线程状态&优先级
• 毫秒级CPU使用率
火焰图&
线程甘特图
16. 归因的降本增效 (卡顿)
发现卡顿
查日志
工具
埋点
重打包
复现卡顿
分析数据
归因
17. 归因的降本增效 (卡顿—慢函数)
• 主线程sqlite3_step
• 耗时4.43s
18. 归因的降本增效 (卡顿—慢函数—锁等待)
Blocked 8.792ms and
runable by thread 0x9971 in Lark
Block by NSLock
19. 归因的降本增效 (卡顿—慢函数—资源抢占)
卡顿——资源抢占:
•
•
•
软中断
高优先级线程抢占主线程
优先级反转
20. 归因的降本增效 (卡顿—低消耗高频)
卡顿——低消耗高频函数:
•
•
火焰图无平顶函数
各函数调用符合预期
21. 归因的降本增效 (卡顿—低消耗高频)
卡顿——低消耗高频函数:
•
•
火焰图无平顶函数
各函数调用符合预期
22. 归因的降本增效 (卡顿—类预加载)
JVMTI
• EventClassFileLoadHook
•
EventClassLoad
•
EventClassPrepare
Preload Class
23. 归因的降本增效 (卡顿—启动)
• 横向对比
• 数据波动
• 监控粒度
24. 归因的降本增效
内存消耗在哪?
内存问题
定位到代码或资源
• 内存节点与引用关系
• 节点与代码或资源的映射关系
引用树&
各维度聚类
25. 归因的降本增效 (内存)
MemoryGraph
Link Map
节点内存
节点引用边
Java:dump hprof
Native:Raphael
内存归属
26. 归因的降本增效 (内存)
聚类
排序
补充
信息
• 某一场景内存居高不下
• 进入某一场景后,内存 “激增”
对比
27. 归因的降本增效 (内存)
28. 归因的降本增效 (内存)
Bitmap
• 是否使用
• 图片还原
29. 归因的降本增效 (内存)
对比
• 放大变量
• 聚焦范围
30. 归因的降本增效
如何精准测量?
功耗问题
各类图表
定位到代码
• 系统维度统计电量消耗
• 多指标归因能力联动
31. 归因的降本增效 (功耗)
sysdiagnosis
电量
iPhone
AppleSmart Battery
电流
华为
小米
Oppo
Thor
电压
32. 归因的降本增效 (功耗)
33. 归因的降本增效 (数据生产—Fastbot)
34. 大纲
1. 线下工具的前世今生
2. 性能归因的降本增效
3. 原理分析
4. 总结回顾
35. 原理分析
火焰图
=
Hook:
插桩:
采样:
+
线程
快照
JVMTI
systrace
profilo
fishhook
llvm
ktrace
符号化
36. 原理分析
The ktrace utility enables kernel trace logging for the specified pro-cesses. Kernel trace
data is logged to the file ktrace.out. The kernel operations that are tracedincludesystem
calls, namei translations, sig-nal processing, and I/O.
37. 原理分析
wait_result_t thread_block_reason(args) {
thread_t self = current_thread();
if (self->state & ~(TH_RUN | TH_IDLE)) {
KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE,
MACHDBG_CODE(DBG_MACH_SCHED, MACH_BLOCK),
reason, VM_KERNEL_UNSLIDE(continuation), 0, 0, 0);
}
// 切换其他线程
do {
new_thread = thread_select(self, processor, &reason);
} while (!thread_invoke(self, new_thread, reason));
sched_prim.c
Thread Event
code
}
boolean_t thread_unblock(thread_t thread, wait_result_t wresult) {
KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE,
MACHDBG_CODE(DBG_MACH_SCHED, MACH_MAKE_RUNNABLE) | DBG_FUNC_NONE,
(uintptr_t)thread_tid(thread), thread->sched_pri, thread->wait_result,
sched_run_buckets[TH_BUCKET_RUN], 0);
}
Kernel Debug
38. 原理分析
static uint64_t kptimer_fire(args) {
// ...
if (sample_flags & SAMPLE_FLAG_NON_INTERRUPT) {
// outside of interrupt context, backtrace the current thread
kperf_backtrace_sample(&(sbuf->kcallstack), context);
} else {
kperf_kcallstack_sample(&(sbuf->kcallstack), context);
}
}
void kperf_backtrace_sample(args) {
// ...
kernel_debug(PERF_CS_BACKTRACE | DBG_FUNC_START, 1);
cs->kpkc_nframes = backtrace_frame(cs->kpkc_word_frames,
cs->kpkc_nframes - 1, context->starting_fp, &trunc);
kernel_debug(PERF_CS_BACKTRACE | DBG_FUNC_END, cs->kpkc_nframes);
}
kperf / kptimer.c
timer_fire
backtrace_sample
kernel_debug
39. 原理分析
62078
Jan,2022
40. 原理分析
libimobiledevice
adb
idb
tidevice
Jan,2022
41. 原理分析
USBMuxd
usb / wifi
•
•
Lockdownd
socket
用于在USB协议上实现多路TCP连接
将USB通信抽象为TCP通信
DeveloperDiskImage
42. 原理分析
USBMuxd
usb / wifi
Lockdownd
DeveloperDiskImage
socket
•
•
iOS系统上: /System/Library/LaunchDaemons
lockdownd 会创建一个 TCP socket,端口号为 62078
43. 原理分析
USBMuxd
usb / wifi
?
Lockdownd
socket
ClassName
DeveloperDiskImage
DTXMessage
+
SelectorName
+
Arguments
44. 原理分析
USBMuxd
usb / wifi
Lockdownd
socket
DeveloperDiskImage
DTXMessage
DTXMessageParser
waitForMoreData: incrementalBu er
DTXMessage
invokeWithTarget: replyChannel: validator
runningProcesses
45. 原理分析
USBMuxd
usb / wifi
•
Lockdownd
socket
DeveloperDiskImage
DTXMessage
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
46. 原理分析
USBMuxd
usb / wifi
•
Lockdownd
socket
DeveloperDiskImage
DTXMessage
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
47. 原理分析
USBMuxd
Lockdownd
DeveloperDiskImage
DTXMessage
_requestChannelWithCode:
identifier:
NativeClass
Channel
ServiceID
Channel code
DTXMessage
Selector & Arguments
Channel code
DTXMessage
Function Return
Channel code
Jan,2022
48. 原理分析
start server
“Instruments.remoteserver”
published capabilities
iPhone 1
iPhone 2
services.
activitytracetap
services.
sysmontap
services.
graphics.opengl
services.
coreprofile
device monitor
code & channel
start server
“mobile_image_mounter”
dxt message
is mount
mount image
parse plist data
CPU
GPU
Net
parse ktrace data
Battery
Fps
Stack
49. 大纲
1. 线下工具的前世今生
2. 性能归因的降本增效
3. 原理分析
4. 总结回顾
50. 总结回顾
前世今生
降本增效
线下工具的发展目标
对比Instruments与Perfetto的优势
采集
消费
卡顿分析 快照采集的另一种方式ktrace
内存分析 62078后⻔的工作原理
功耗分析
数据
生产
原理分析
Fastbot
51. 总结回顾
让工具变得更简单,使归因不再有⻔槛
52. 鸣谢:
• 字节的AppHealth团队及各业务方团队的技术方案与落地实践
• ArchSummit主办方及出品人老师给予的平台与指导意⻅
Diggo
Anytrace
53.
54.