飞书MemoryGraph实践分享

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. ⻜书MemoryGraph实践分享 分享嘉宾:蔡亮
2. 在这里,你可以了解到 • ⻜书为什么选择APMPlus • APMPlus效果与体验 • MemoryGraph实战 • MemoryGraph的一些经验 • APMPlus的其它收益
3. ⻜书是一款什么样的应用? • ⻜书是字节跳动旗下先进企业协作与管 理平台 • 一站式整合及时沟通、智能日历、音视 频会议、⻜书文档、云盘等办公协作套 件,更提供OKR、招聘、绩效等组织管 理产品 • 作为企业协作与管理平台,业务复杂度 非常高,例如:千人视频等
4. ⻜书对APM的要求? • 更低的接入成本(非侵入式SDK) • 更全面、更高效的的异常探测手段 • 更丰富的异常现场还原能力 • 更灵活的采样方式,以节省开支 • 全面报警响应机制 • 多平台支持 • …
5. ⻜书为什么选择APMPlus? • APMPlus全称“应用性能监控全链路版”,是火山引擎提供的针对应用服务的品质、性能以 及自定义埋点的APM服务 • 经过今日头条、抖音、⻜书等大型App的验证,能够保证SDK自身的稳定性,并提供更好 的异常探测手段和异常现场还原能力 • 提供全链路支持:App(iOS、Android)端、Web&小程序、服务端等 • 更低的接入成本:非侵入式SDK • 提供全面报警响应机制 • …
6. ⻜书+APMPlus的效果与体验 OOM 不使用APMPlus 使用APMPlus 2‰ 0.8‰(降幅60%) 发现30例+ MemoryGraph Crash+卡死 分析能力 3‰ 1.5‰(降幅50%) • 使用Xcode自带的分析工具,只 • 能够分析线上问题,贴近用户使 用场景; 能分析线下问题; • 分析效率更高,降低分析成本; • 分析成本较高;
7. MemoryGraph案例分析一 标题:Leaked Memory 产生原因:没有正确的管理内存,造成的OOM崩溃 适用场景: • 侦测线上环境因内存泄露造成的OOM崩溃 • 可以作为debug环境的补充
8. - (void)dealloc { [super dealloc]; if (!self.isLeaked) { [self.largeObject release]; } } MemoryGraph案例分析一 BDLargeObject - (MRC) BDLeakedObject for (int index = 0; index < 5000; index++) { BDLeakedObject *leakedObject = [[BDLeakedObject alloc] initWithName:xxxxx]; if (0 != index && 0 == index % 100) { sleep(1); } 依赖 BDLargeObject *largeObject; isLeaked = YES - (instancetype)initWithName: (NSString *)name; BOOL isLeaked; BDInnerLargeObject *largeObject; -(instancetype)initWithLeakedObject: (BOOL)isLeaked; } BDInnerLargeObject - (MRC) long *_nums; - (instancetype)init { ... _nums = (long *)malloc(sizeof(long) * 1024 * 128); ... }
9. 入口代码展示 BDLeakedObject展示 BDLargeObject展示 BDInnerLargeObject展示 日志 程序运行 事件开启 内存状态 Log日志
10. OOM案例分析一 MemoryGraph数据
11. MemoryGraph案例分析二 标题:AutoreleasePool 产生原因:没有及时倾倒AutoreleasePool中的对象,造成的OOM崩溃 适用场景: • 侦测复杂业务的内存使用状态
12. - (void)dealloc { [super dealloc]; if (!self.isLeaked) { [self.largeObject release]; } } MemoryGraph案例分析一 BDLargeObject - (MRC) BDAutoreleaseObject for (int index = 0; index < 5000; index++) { __autoreleasing BDAutoreleaseObject *autoreleaseObject = [[BDAutoreleaseObject alloc] initWithName:xxx]; 依赖 BDLargeObject *largeObject; isLeaked = NO - (instancetype)initWithName: (NSString *)name; if (0 != index && 0 == index % 100) { sleep(1); } BOOL isLeaked; BDInnerLargeObject *largeObject; -(instancetype)initWithLeakedObject: (BOOL)isLeaked; } BDInnerLargeObject - (MRC) long *_nums; - (instancetype)init { ... _nums = (long *)malloc(sizeof(long) * 1024 * 128); ... }
13. OOM案例分析二 入口代码展示 BDLeakedObject展示 BDLargeObject展示 BDInnerLargeObject展示 日志 程序运行 事件开启 内存状态 Log日志+内存状态
14. MemoryGraph案例分析二 MemoryGraph数据
15. OOM案例分析三 标题:图片下载 产生原因:系统库的一些机制问题 适用场景: • 侦测系统库和三方库的一些机制问题
16. MemoryGraph案例分析一 for (int index = 0; index < 500; index++) { [BDImageDownload imageDownloadWithURL:[NSURL URLWithString:xxxx] completion:^(BOOL isSuccess, UIImage *image) { NSLog(@"ImageDownload index = %d, result = %@.", index, isSuccess ? @"YES" : @"NO"); }]; } 依赖 BDImageDownload - (instancetype)initWithName: (NSString *)name; + (void)imageDownloadWithURL:(NSURL *)url completion: (ImageDownloadResultBlock)imageDownload { dispatch_queue_t queue = dispatch_queue_create("com.bytedance.imageload", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; … }); }
17. 入口代码展示 BDImageDownload展示 程序运行 事件开启 内存状态 Log日志+内存状态
18. OOM案例分析三 MemoryGraph数据
19. MemoryGraph的一些经验 • OOM的触发不一定是内存泄露,也有可能是对机制的使用不合理造成的 • MemoryGraph优先确认聚类列表中占用内存大的内存块 • MemoryGraph优先确认同类型数量比较大的内存块。在大型项目中,同类型对象理论个数 是可以达到20-30万的。超过这个量,就应该纳入重点排查对象中 • MemoryGraph中同类型的类,往往会存在两种状态,可以通过打标签的形式,快速找到类 没有泄露时的状态,方便排查问题 • …
20. APMPlus带来的其它收益 • 用户异常单点分析能力,通过内存异常、CPU异常、卡顿、磁盘、⻚面加载耗时等维度快 速发现用户使用App时的异常,并提供高效的解决方案; • Crash分析能力,除了基础的异常堆栈分析外,还提供了寄存器和栈内存信息,并基于 Alog日志发现Crash时的用户日志信息; • 平台提供了丰富的归因能力,包括且不限于异常分析、多维分析、自定义上报、单点日志 查询等,结合灵活的报表能力可了解各类指标的趋势变化;
21. 感谢观看

Home - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-15 20:40
浙ICP备14020137号-1 $Map of visitor$