故障报告
周五晚上十一点,服务器崩了。
韩清是周一早上知道的。刚进公司,就被叫进总监办公室。总监李峰把一份报告推到她面前,封面印着“重大故障分析”。
“上周五的线上故障,”李峰没抬头,手指敲着报告第三页,“你的代码导致的。”
韩清拿起报告。事故描述:用户支付模块崩溃四十七分钟,导致订单流失预估三百二十万。根本原因分析:函数calculateDiscount()存在递归逻辑错误,引发内存溢出。
那是她的函数。三个月前写的。
“不可能。”韩清听见自己声音发干,“这个函数上线前测试全覆盖,三个月运行正常。”
“运维日志显示很清楚。”李峰终于抬眼,“周五晚上十一点零三分,你的函数调用栈溢出,触发雪崩。”
空调出风口嘶嘶作响。韩清翻到日志附录,密密麻麻的时间戳确实指向她的模块。但调用频这个地方不对劲!正常时段这个函数每分钟调用几百次,但故障前五分钟,调用次数突然飙升至每分钟十万次。
“这是被攻击了。”韩清指着数据。
“安全部的结论是正常流量。”李峰靠回椅背,“市场部昨晚做了促销推送,瞬时流量暴涨是正常的。问题在于,你的代码没扛住正常峰值。”
“可这峰值不合理…”
“韩清。”李峰打断她,声音放软了些,“我知道你平时认真。但这次事故影响很坏,今晚要向VP汇报。我们需要有人承担责任。”
“所以是我?”
“你是模块负责人。”李峰移开视线,“公司有规定,三级以上事故,责任人年度绩效清零,年终奖取消。我已经争取过了,不开除,只是评级调整。”
韩清指尖冰凉。她想起上周四晚上,她走时隔壁工位还亮着灯。王骏在改数据库配置,说是性能优化。
“上周四,王骏是不是改了订单服务的配置?”
李峰表情空白了一瞬:“这和王骏有什么关系?”
“他动过数据库连接池参数。”韩清语速加快,“如果连接数设置错误,可能导致所有请求堆积到计算节点,触发异常调用”
“运维报告没提这个。”李峰敲敲报告,“别瞎猜。”
回到工位时,周围很安静。但韩清能感觉到斜对面的小群消息跳得格外频繁,有人快速抬头看了她一眼又低下,敲键盘的声音都刻意放轻了。
午休时,她在茶水间遇到了测试组的刘静。
“看到邮件了?”刘静接咖啡,声音很低,“故障定级是三级。你们部门今晚要有人去VP会挨骂。”
“不是我代码的问题。”
刘静搅拌棒碰着杯壁,叮,叮,叮。“王骏昨晚在群里可积极了,发了十几条技术分析,句句都往计算模块引。”
韩清握紧马克杯。
“对了,”刘静状似无意,“上周四下班时,我看见王骏在动预发环境配置。问他,他说是李峰让调的,优化双十一性能。”
“李峰知道?”
“你说呢?”刘静笑了笑,那笑容里有种过来人的无奈,“他下个月升总监,这个节骨眼上,他手下不能出大纰漏。但总要有人背锅,不是王骏,就是你。王骏跟了他五年,你呢?两年。”
咖啡机嗡嗡作响。韩清看着褐色液体注入纸杯,想起三个月前上线前夜,她逐行检查那个函数到凌晨三点。王骏当时说:“这么认真干嘛,出问题也是大家一起扛。”
下午,韩清去了运维部。负责日志的小赵看见她,表情有点尴尬。
“日志能给我看原始的么?不只要摘要。”
小赵犹豫:“李总监说,故障相关数据要统一出口……”
“我是责任人,有权看完整证据。”韩清声音很平。
小赵叹了口气,调出屏幕。原始日志流滚过,时间戳精确到毫秒。韩清俯身盯着,看到故障前五分钟,订单服务的数据库响应时间从十毫秒飙升至三千毫秒,所有请求超时。紧接着,计算节点开始收到海量重试请求。
“这是典型的数据库端先崩了。”韩清指着屏幕。
“但报告里写的是计算模块先异常。”小赵小声说。
“因为有人删了这段日志?”韩清转头看他。
小赵不说话了。良久,他才低声说:“原始日志是完整的。但提交给总监的报告……是摘要版。”
“谁做的摘要?”
“王骏昨天来要的日志,他说统一出分析报告。”
窗外天色暗下来。韩清坐回工位,屏幕亮着,故障报告的PDF文件还开着。她点开内部通讯系统,找到三个月前和王骏的聊天记录。关于数据库配置变更的评审,她明确写过:“连接数不宜超过200,否则有雪崩风险。”
王骏回复:“收到,会注意。”
而上周四下午四点,王骏申请修改预发环境配置,将连接数从200改为2000。审批人:李峰。
韩清截了图。一张,两张,三张。包括王骏在故障后技术群里带节奏的消息:“计算模块的老问题,早该重构了。”
五点五十分,下班音乐响起。周围人开始收拾东西,键盘推入抽屉,椅子归位。韩清没动。她打开邮件,新建。
收件人:VP,技术委员会全体,部门全员。
主题:关于周五线上故障的补充说明与证据附件。
她开始打字。冷静地陈述时间线,附上截图,标记出被删节的日志与完整日志的对比。每一个指控都有证据支撑,每一个推论都有数据来源。指尖敲击键盘的声音清脆,在渐空的办公区里回响。
写到结尾时,她停了几秒。然后继续:
“作为模块负责人,我未能及时发现关联系统异常,有一定责任。但主要责任在于:一,违规修改核心配置;二,故意隐瞒关键证据;三,误导事故分析方向。具体人员见附件。
我无法认同当前事故报告。如公司认可这份不实报告,我将正式辞职。”
发送。
邮件进度条走到100%时,韩清听见隔壁工位传来吸气声。很快,更多人看向屏幕,然后看向她。细碎的议论声像水波漫开。
王骏从会议室冲出来,脸色涨红:“韩清你……”
“我发了证据。”韩清站起来,平静地看着他,“有问题可以反驳。”
李峰的办公室门开了。他站在门口,表情是韩清从未见过的僵硬。“韩清,进来一下。”声音试图平稳,但尾音发颤。
“就在这儿说吧。”韩清没动,“邮件是群发的,大家都该听听。”
整个办公区死寂。有人屏住呼吸,有人偷偷摸出手机。
“你这样做,考虑过后果吗?”李峰每个字都像从牙缝里挤出来。
“考虑过。”韩清说,“最坏是离职。但比起背着不属于自己的黑锅继续工作,离职没那么可怕。”
她开始收拾东西。动作很慢,但很稳。拔掉电源线,合上笔记本,将笔一支支放进笔袋。那个印着公司logo的马克杯,她留在了桌上。
走到电梯口时,背后终于爆发争吵。王骏尖利的声音,李峰压抑的怒斥,还有其他人劝架的嘈杂。韩清没回头。
电梯镜面映出她的脸,有点苍白,但眼睛很亮。手机震动,是几条私信:“支持你。”“牛!”“早该有人捅破这层纸了。”
她没回。走出大楼时,晚风扑面而来,带着初秋的凉意。背包里,离职申请已经签好名。但她不着急交,她想看看,明天太阳升起时,那份故障报告会不会被修改,那些该被追责的人会不会收到他们应得的邮件。
而此刻,她只是深深呼吸,把积压了一整天的、混着冷气与咖啡味的空气,全部换成晚风。路灯次第亮起,她走入其中一道光里,影子在身后拉得很长,像一柄终于出鞘的、不再回头的剑。