云端卡顿、高延迟?Android日志驱动性能优化实战
|
崩在真机那一刻,王磊刚把手机塞给我,屏幕还泛着灰白光,连个错误弹窗都没有——就是不动了,像被掐了脖子。 我原以为是热更新没刷干净,结果抓包一看,根本没发请求。再切logcat,连Log.d("pay", "start")都没冒出来。人还在工位上,手已经伸向隔壁桌的充电线了:你这台vivo X80,刚清过缓存没?他头都不抬,手指在键盘上噼啪敲,“刚清完,现在连不上adb”,外放会议声从斜后方飘过来,讲什么“SLO指标对齐”,音量调得刚好盖住我敲回车的声音。 构建进度条卡在百分之八十七,停了快两分钟,我盯着它,手边水杯底结了一圈渍,淡黄的,像茶垢又像奶渍,擦了三次,越擦越晕。浏览器开了三十来个标签,其中七个是去年十一月的埋点文档,三个是Android 14兼容性通告,剩下全是chrome://inspect里打不开的devtools空白页。谁在旁边开外放会议,音量不大,但“灰度节奏”那几个字反复钻进耳朵,我下意识把耳机塞进左耳,右耳还漏风。 后来拉出日志链路才看清:不是接口慢,是本地日志采集器自己卡死了。每条event都往内存buffer里堆,buffer满了就等IO线程写磁盘,可IO线程在等主线程释放一个锁——而主线程正等着那个日志线程把一条崩溃前最后的trace上报完。死锁。真机上死,模拟器上跑得比谁都欢。林薇当时在测还原度,切图刚交,她指着Figma上那个loading动画问我:“这个转圈半径是不是比设计稿小两像素?”我没答,她又补一句:“你们日志是不是把onDraw全拦住了?”我说不是,她说“那为啥我滑动列表的时候,回流重绘延迟了四百多毫秒?” 机箱风扇一直在转,嗡嗡的,不吵,但你一静下来就听得到。外卖的塑料袋响个不停,有人拆餐盒,塑料摩擦声尖得刺耳。桌上的数据线缠成一团,红蓝黑三根,绕了五圈半,插头歪着,USB-A口朝天,像个没站稳的句号。 去年寒假,线上翻车是凌晨三点十七分,用户反馈“付款页面点了没反应”,运营在群里甩截图,白屏,底下还带一行系统提示“应用无响应”。我扒日志发现,当天新增的“云同步状态上报”逻辑,没加采样,也没走异步队列,直接在Activity onResume里call了Log.e(“cloud”, “status=” + json.toString())。那个json里嵌了设备型号、当前WiFi SSID、蓝牙设备列表……全吐出来,平均单条3.2MB。真机内存紧,logcat buffer爆了,整个Log系统假死。后台服务照常跑,前端感知不到,但所有埋点全丢。不是漏报,是压根没生成。 我不屑提“优胜劣汰”这个词,但这次真是——日志SDK里那套老采集器,连背压控制都没有,上游push太猛,下游不接招,就只能被踢出局。新换的那套,加了滑动窗口+采样阈值+本地LRU淘汰,上线后,相同场景下,主线程阻塞时间从860ms降到27ms,浮动很大,记不清是哪个版本了,大概那个数。可你猜怎么着?后端同学上周说他们日志平台吞吐翻倍,倒不是因为前端日志质量高了,是因为原来我们打的日志里,七成都带重复timestamp、冗余包名、空字段占位符,他们解析引擎一碰就OOM。删掉这批“无效呼吸”,他们查日志反而快了。所以真不是我们在优化体验,是我们终于不拖后腿了。 我电脑上跑得好好的。昨天连着跑三遍build,clean,assembleDebug,全部秒过。今天突然卡在Dexing,等了四分钟,弹出error: java.lang.OutOfMemoryError: GC overhead limit exceeded。重启AS没用,杀掉gradle daemon重来,还是卡。最后发现是我开了五个终端窗口,两个在tail -f /var/log/syslog,一个在watch -n1 'free -h',还有一个在跑tcpdump——但最可疑的是,我桌面上那个钉钉图标,右下角一直挂着个小红点,点开,是行政部发的《春节加班餐补登记表》没填。我填了,红点没了,Dexing居然好了。信不信由你。
文章配图,仅供参考 张工在联调时说了一句:“你们日志打太密,我们接口压测一上来就超时。”我没吭声,回去翻了三天旧日志,发现他那边的timeout配置,写的真是3000ms。可我们日志批量上传的间隔默认是1500ms——不是并发狂刷,是定时轮询。他那边没做连接复用,每次新建HTTP连接耗时就在900–1300ms浮动。所以真正卡住的不是网络,是他们每两次收包之间,硬生生等出三百毫秒的gap。他改了配置,我们没动代码,延迟下去了。这就挺没劲的。 现在我每天第一件事,不是看监控大盘,是先检查本地logcat buffer size有没有被其他同事偷偷调大过。上次有个实习生,为了看清楚ANR trace,把buffer改成8M,结果连上他那台小米13,整台电脑adb就失联。这事我谁都没说,只默默改回默认值,还顺手把他的git config --global core.editor改成了vim,怕他下次又手抖改错配置文件。工具只是工具,人错了,再好的SDK也扛不住。 接下来打算把采样逻辑下沉到Native层,在log写入前做轻量过滤。不是为了省流量,是防主线程再被某个傻逼toString()拖垮。不过现在不敢推,得等下个灰度周期——先找十台真机,手动刷一遍rom,看看会不会触发某些厂商ROM里藏着的日志拦截hook。林薇说她下周要交新版动效验收,可能没空陪我蹲机房。王磊倒是答应帮忙,但他笔记本散热口卡着半块巧克力,上次开机风扇转起来,像在嚼碎饼干渣。 (编辑:52站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |




