四月第二个星期三,北方工业大学图书馆把星辰搜索的测试地址印进了新生检索培训材料。
上午,高老师还打电话确认过容量。马飞看着此前最高二十三并发的曲线,答复三十人可以分批使用。双方说好两点开始,星辰这边由周成守服务器,马飞带着饭盒去银行交电话费,苏雨桐则到学校观察学生实际操作。
没人注意到培训材料上写的是“统一打开页面后听老师讲解”。一百多名学生几乎在同一分钟坐到了机器前。
北方工业大学图书馆把星辰搜索的测试地址印在了新生检索培训材料上。
下午两点十分,第一批学生走进机房。
两点十二分,并发查询达到十七。
两点十四分,达到四十一。
两点十五分,半地下室里的硬盘开始发出连续的寻道声。查询队列越积越长,内存被索引块和连接缓冲反复争抢。系统没有立即崩溃,它只是越来越慢。
楼上五金店老板第一个听见异常。他下来时,硬盘声已经密得像雨点,周成正把手贴在机箱侧面试温度。老板不懂队列,只问了一句:“要不要先把库存程序关了?”
库存程序没有占资源。马飞从银行赶回来,连外套都没脱,先让老板停止从这条线路接传真,避免现场再多一个变量。
三秒。
十二秒。
四十七秒。
然后所有连接一起超时。
周成先去重启机器。
马飞拦住他:“先留现场。”
“用户都进不来。”
“现在重启,只会得到一台不知道为什么死过的机器。”
周成看着电话旁不断增加的未接来电,手背都是汗:“学校那边一屋子人在等。”
“给高老师回电,报真实恢复时间。你存队列,我存内存,三分钟后无论完成多少都重启。”
他们第一次给事故保存设了上限。两分四十秒后关键数据落盘,马飞亲手拔线。周成按重启键时,五金店老板在楼梯口掐着表,整层楼都听得见机器风扇重新升速。
他们把当前进程、队列长度、内存占用和最后一百条请求写进文件。等保存完成,马飞才拔掉网络线,重启服务。
两点二十六分,系统恢复。
两点二十八分,再次超时。
苏雨桐从学校打来电话。她在机房里看见的不是报错,而是一排学生不断敲回车。
她身后全是键盘声。授课老师站在讲台上反复让学生不要再按,后排的人却看不见前面的情况,只能以为自己的机器没收到。一个男生已经提交了十一次相同查询,还在对同桌说网络大概断了。
“页面没有告诉他们请求已经收到。”她说,“每个人都在制造第二次、第三次查询。”
星辰把沉默误当成了等待。
用户把沉默理解成没有发生。
第二次恢复前,马飞临时加了一张纯文字页面:
“当前查询人数较多。您的请求已进入队列,请勿重复提交。”
同时把每个来源的未完成请求限制为一个。
系统仍慢,却没有第三次雪崩。
苏雨桐在学校把学生分成两组。等待的那组先听图书管理员讲馆藏目录,另一组继续查询,二十分钟后交换。最初满屋抱怨的人渐渐安静下来;页面上的队列提示开始显示“前面还有七个请求”,学生至少知道系统没有漏掉自己。
培训结束时,高老师把印错使用方式的材料收回一部分,没有把全部责任推给星辰。那名连续提交十一次的学生则留下查询词,问能否查出十一份请求究竟浪费了多少时间。
晚上,团队复盘。
半地下室没有足够椅子,四个人围着两只倒扣的纸箱坐。高老师通过免提电话参加,五金店老板也留下来,因为下午停传真影响了他的进货。他要求星辰把这段损失记清楚,哪怕最后只有两通电话。
周成坚持认为应该先买更快的机器。
苏雨桐把白天的日志分成三段。
前十七个并发时,cpU仍有余量,磁盘等待急剧上升。
四十一个并发时,相同索引块被不同进程重复读取。
超时后,重复提交把队列放大到原来的二点六倍。
“三种问题。”她说,“容量不够,缓存错误,界面没有反馈。只换机器,后两种会一起搬过去。”
马飞在白板上写下三个目标。
第一,热门索引块共享只读缓存。
第二,队列超过阈值时拒绝新请求,而不是无限积压。
第三,结果页必须显示排队、超时和失败,不让用户靠猜。
“拒绝请求?”周成皱眉,“那不是主动赶用户?”
“比让他们等一分钟再失败诚实。”
高老师在电话里同意:“下次课程按两批,但你们也别把三十二写成三十人的保证。一个人会点不止一次。”
马飞把上午那句“三十人可以”记进故障原因。他给的是人数,系统真正承受的是同时未完成请求,两者之间没有固定等号。
接下来四天,星辰停止扩大测试范围。
周成改查询进程,苏雨桐重做热点词回放,马飞负责把失败状态写进页面。每次修改都用那天下午的请求顺序重放。
在原机器上,系统最终稳定支撑三十二个并发查询。
第三十三个会得到明确的繁忙提示。
这是一个不体面的上限。
但它是真的。
周成连续重放十次下午的请求顺序,三十二个全部返回,第三十三个收到繁忙提示。第十次结束时已经凌晨三点,他盯着屏幕等了整整五分钟,确认队列没有偷偷留下未完成请求,才在容量曲线上签字。
苏雨桐又从真实学生里找三个人盲测提示页。他们能说清楚请求被拒绝,而不是误以为页面坏了。那个提交十一次的学生算出自己放大了九次无效请求,在反馈表上写:“原来我也推了一把。”
马飞给三所高校发出故障说明,列出中断时间、原因、临时修复和仍未解决的容量问题。没有把责任推给学生重复点击,也没有把“访问量激增”写成值得庆祝的新闻。
图书馆回信说,下次培训会分两批进行。
半地下室的墙上则多了一张容量曲线。
曲线尽头,马飞画了一条红线。
三十二。
五金店老板在红线旁贴了两张未接传真清单,损失核为零元,但备注写着“曾影响正常使用”。高老师的回信钉在另一边,确认下一次培训分两批,并提前提供人数和课程流程。
天亮时,马飞把银行交费回执从外套口袋里掏出来,发现已经被汗浸软。他去街口买了四份豆浆,回来时周成趴在纸箱上睡着,手还压着第十次回放记录。
马飞没有叫他,只把那张写着“三十二”的曲线往墙上钉牢了一些。