网站卡顿根因揭秘:多媒体运维避坑指南
|
跟老板拍桌子那天下午三点,空调出风口正对着我后颈吹,冰得我缩了三次肩膀——第三次缩的时候他手机震了,低头划了三下,抬眼说“你先说重点”。我就把那张Lighthouse跑分截图发到群里,带个红圈标着FCP 2.8秒,底下写“首屏救不了,不是JS的事”。群里没人回。静了四十七秒。前段PM在隔壁工位啃苹果,咔嚓声特别清脆,像在嚼我刚拆的trace。 我原以为是CDN缓存失效,结果查完边缘节点日志发现,根本没走CDN。全量请求直打源站,而源站那台扛静态资源的机器,CPU在午休时段稳定压在91%——不是尖峰,是平滑的、持续的、带着呼吸感的91%。运维说“监控没告警”,我说“你去看/proc/loadavg里第三列的15分钟均值”,他调出来扫了一眼,手指悬在键盘上停了两秒,然后默默切回钉钉,回了句“等我重启一下nginx配置”。我没拦。他重启了。五分钟后,LCP反而多跳了三百七十二 KB——因为新配置把WebP转码规则漏写了,所有图片回落成JPEG,还带了一个没关的录屏在桌面右下角一直晃着进度条。 优胜劣汰不是口号。是真的。上个月上线的那个视频封面懒加载组件,前端加了IntersectionObserver,但没配rootMargin,导致用户划到第4屏才触发加载——可首页首屏下面那行“猜你喜欢”里塞了6个video标签,每个都preload="metadata"。metadata本身不下载帧,但会触发HTTP/2优先级树重建,我们那套自研的优先级调度器又没适配QUIC,结果首屏CSS和关键JS直接被挤到第3个RTT才下发。这个我敢打包票:抓包里看到两个同域请求的流ID差了217,就是它干的。但你说这是前端bug?不是。是产品上周五临时加的需求评审里,用黄色荧光笔画了句“封面要带动态预览效果”,后端顺手把video src改成了/mp4/v1?id=${id},连mock都没切。现在想来,他换充电线的时候我正蹲在机房柜子前看BMC日志——对面工程师拔掉那根紫灰相间的Anker线,插进新买的黑色绿头USB-C线,动作慢得像在卸载信任。 跟产品吵完第二天,我拉了个全链路debug会议,开了二十分钟。后端说“trace里HTTP状态全是200”,前端说“performance.getEntriesByType('navigation')显示FP正常”,PM翻着需求文档说“上次验收时没卡啊”。我当场导出三组trace:一组是凌晨四点无流量时,一组是早高峰前十分钟,一组是她自己用iPhone XS真机连Charles截的。三组的Span里都有一个叫“multimedia_meta_resolver”的服务,但调用路径完全不一致——第一组走grpc,第二组走http,第三组……第三组里这玩意儿根本没出现,它被SDK自动降级成本地JSON了。我说“这服务昨天上线过”,后端愣住:“哦,那个灰度开关我忘关了。”我盯着他工牌挂绳上的小裂口,没说话。下午两点零三分,我倒了杯水,路过茶水间看见保洁阿姨在擦饮水机侧面的水渍,左手拿着块蓝布,右手捏着半块湿纸巾,来回换了四次角度。 其实最坑的不是这些。是那个叫“媒体质量兜底策略”的配置中心项,type字段写的是string,但实际接收的是array——去年某次merge冲突时,后端同事手动删掉了类型校验注解,只留了默认值空数组。半年来没人动过它,直到上月CDN突发故障,兜底逻辑触发,把全部HLS manifest强行替换成MP4链接,结果客户端解码器爆了OOM。这事我本来不想提,但它直接导致三个灰度城市全量回滚。说回KPI折算这事吧:我们Q3的“多媒体链路P95延时达标率”,最后按百分比加权时,把video/audio/metadata三项混着算,其中metadata占比17%,而它根本不在关键路径上。技术上毫无意义,但财务系统认。我就看着那个数字从89.6%硬拖到92.3%,像给尸体化妆。
文章配图,仅供参考 所以现在我只要看到trace里出现/media/或/embed/开头的Span,第一反应不是查下游,是翻最近七天的CI流水线日志,再盯五分钟Jenkins构建参数里的–enable-media-optimization是否被某个PR自动覆写。有时候它写着true,但实际执行的是false——因为有个npm脚本读取.env.production时,默认fallback到了开发环境的占位符。这个我说不准,得重放三次。但我知道:上月有十八毫秒的卡顿,根源是某个播放器SDK里for循环里写了await fetch(),还用了for...in而不是for...of——那个写法在V8 10.2里会触发隐藏类脱轨。这不是推论,是我们在A/B测试分支里单行注释掉那一行,LCP直接往下掉了四百毫秒。对,就四百毫秒。不多不少。我现在每次改播放器相关代码,都要先问一句:这行会不会让v8吐出过渡隐藏类?下周一我打算把所有含preload="metadata"的video标签批量替换为poster+data-src模式,顺手在build脚本里加个AST扫描。不过可能白干——听说下季度要把所有静态资源迁到另一个云厂商,对方的OSS不支持Range请求的精准字节切片。到时候再说吧。我先把桌上那个没关的录屏关了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



