概述
I/O监控,可以监控APP运行时,出现的I/O问题,包括文件主线程I/O,读写buffer太小,重复读,文件句柄未关闭。
检测原理
[图片上传失败...(image-c877a-1604645919078)]
文件I/O监控采用的native hook的方式,通过hook文件操作接口,来收集I/O信息。
文件句柄关闭监控采用的是Android 框架提供的StrictMode。StrictMode有专门针对文件close监控的dalvik.system.CloseGuard模块。只需通过反射机制,打开CloseGuard监控,并动态代理CloseGuard中的Reporter接口,即可监控到文件/句柄未关闭导致的泄露。
以FileInputStream为例,当gc的时候会调用FileInputStream中的finalize方法,其中guard用于标记gc前FileInputStream是否已经调用close关闭句柄。如果gc之前还没有close,调用guard.warnIfOpen。我们通过反射代理guard.warnIfOpen中的REPORTER.report方法获取泄露信息。
[图片上传失败...(image-4f103c-1604645919078)]
[图片上传失败...(image-89d72-1604645919078)]
检测场景
1.主线程IO
耗时的IO操作不能占据主线程太久,当监控到满足以下两个条件,SDK将上报:
1)操作线程为主线程
2)连续读写超过一定阈值(500ms)或单次write/read耗时超过一定阈值 (13ms) [图片上传失败...(image-3ec231-1604645919078)]
2.读写buffer太小
Buffer过小,会导致read/write的次数增多,从而影响性能。监控条件为:
1)Buffer小于一定阈值 (4KB)
2)Read/write的次数超过一定阈值 (20)
3)最大连续读/写时间大于 13ms [图片上传失败...(image-31b63a-1604645919078)]
3.重复读
如果频繁地读某个文件,说明这个文件的内容很常被用到,可以通过缓存来提高效率。监控条件为:
1)文件最大连续读写时间大于13ms(如果文件最大连续读写时间<13ms,就不会加入观察)
2)同一个文件,连续两次读操作间隔小于17ms
3)同一线程读取某个文件的次数超过一定阈值(5次)(这里要求读取的文件路径,堆栈,线程,文件大小等信息均一样)
4.文件句柄关闭泄漏监控:
文件句柄关闭泄漏指的是打开资源包括文件/cursor等,没有及时close,引起泄露。SDK检测到文件open之后没有对应的close,将会上报泄漏。 [图片上传失败...(image-dc85a8-1604645919078)]
网友评论