第八章 压力测试
一、清晨集结
六月三十日,早晨七点十分。
电子市场二楼的灯已经亮了。吴海波煮了一壶浓茶,劣质茶叶的苦涩味弥漫在空气里。李明教授靠在椅背上闭目养神,手指无意识地敲着桌面——这是他思考时的习惯。
陈溯推门进来,手里提着四个塑料袋,里面是刚出笼的包子。
“都吃了。”他把包子放在桌上,“今天可能没时间吃午饭。”
罗斌最后一个到,七点二十五分,踩着约定的时间。他背着一个旧书包,里面装着厚厚的《Linux内核源代码剖析》和几本软盘——2000年U盘还没普及,移动存储靠的是1.44MB的软盘。
“罗斌,吃了没?”陈溯递过一个包子。
“吃了。”罗斌说,但还是接过来,“我妈早起做的稀饭。”
四人围坐,边吃边开始今天的作战会议。
“昨天张伟说今天上午送服务器。”陈溯说,“吴老师,您负责接收和上架。配置单我看了,双CPU,512MB内存,够我们用。”
吴海波点头:“机房那边我已经打过招呼,给咱们留了位置。”
“李教授,监控系统进度如何?”
“基础框架搭好了。”李明调出屏幕,“现在能监控CPU、内存、磁盘使用率,还有服务响应时间。告警规则设了三档:黄色预警、橙色警告、红色紧急。”
“告警发到哪里?”
“目前只能发邮件。”李明说,“我建议买几个BP机,重要告警可以发短信。”
又是钱。陈溯算了一下,四个数字BP机,一个三百左右,一千二。
“先用邮件。”他说,“等试点通过再配BP机。”
“罗斌,”陈溯转向少年,“今天你的任务是做压力测试脚本。模拟100个用户同时发短信,持续一小时。要记录响应时间、成功率、错误类型。”
“100个用户……”罗斌想了想,“网关那边有限制吗?”
“测试网关限速每秒50条。”陈溯说,“但我们不能顶着上限测,控制在每秒30条以内。”
“明白。”罗斌打开电脑,开始写Python脚本——这个年代用Python做压力测试的人还不多,但罗斌已经自学了。
八点整,会议结束,各自行动。
陈溯走到窗前。电子市场还没开门,楼下空荡荡的。几个清洁工在扫街,洒水车缓慢驶过,在路面留下湿润的痕迹。
今天将是关键的一天。服务器到位,系统压力测试,为下周端口开通做最后准备。
手机响了,是张伟。
“陈溯,服务器装车了,九点左右到。我侄子张浩也跟着过去,你多关照。”
“张总放心。”
挂断电话,陈溯回到座位。他打开后台管理界面,系统状态一切正常:服务运行时间23小时47分,累计处理短信532条,零错误。
但这只是开始。真正的考验,是面对真实用户和复杂环境。
二、不速之客
上午九点十分,一辆小货车停在电子市场后门。
张伟的侄子张浩从副驾驶跳下来。二十出头,染了一缕黄头发,穿着紧身牛仔裤和花衬衫,耳朵上戴着银色耳钉。
“陈溯是吧?”张浩上下打量他,“我叔让我来学习。你们这儿……挺破啊。”
驾驶室下来两个工人,开始卸服务器。黑色的机箱,比培训班那台老古董新多了。
陈溯没接张浩的话,径直走向工人:“师傅,小心点,里面是精密设备。”
“知道知道。”工人熟练地卸货,“放哪儿?”
“三楼机房,我跟你们上去。”
吴海波已经在机房等着。胖子老板也在,正指挥工人腾位置。
“就这儿。”胖子指着角落的机架,“电源接好了,网线也是通的。按天算租金,一天八十。”
陈溯点头。服务器上架花了半小时,接电、联网、装系统。吴海波亲自操作,他在DOS命令界面输入一行行指令,额头上冒出细密的汗珠。
十点整,服务器启动完成。
陈溯远程登录,检查配置。双Intel Pentium III 800MHz处理器,512MB SDRAM,两块18GB SCSI硬盘做RAID 1。在2000年,这算是中高端配置了。
“够用了。”他对吴海波说,“把我们的系统迁移过来。”
“现在?”
“现在。”
系统迁移花了两个小时。代码上传,数据库导入,配置文件修改。每一步都可能出错,但吴海波操作得很稳。
中午十二点,新服务器上的系统开始运行。
陈溯用测试手机发了一条短信:“TQ SH”。
三秒后,回复来了:“上海今日多云,27-33℃。紫外线强,注意防晒。”
响应时间比昨天快了四秒。新服务器的性能优势体现出来了。
“压力测试可以开始了。”陈溯对罗斌说。
罗斌点头,运行他写好的脚本。
屏幕上,日志开始滚动:
“[12:05] 启动压力测试,目标:100虚拟用户,持续1小时。”
“[12:05] 用户1-10登录成功…”
“[12:06] 用户11-20登录成功…”
张浩凑过来看:“这啥玩意儿?命令行黑乎乎的。”
“压力测试脚本。”罗斌头也不抬。
“能看懂吗你?”张浩语气轻蔑。
罗斌没理他,继续盯着屏幕。
陈溯看了张浩一眼:“张浩,你叔让你来学习,不是来点评的。如果想学,找个地方坐下,多看少说。”
张浩撇撇嘴,拉过一把椅子坐下,掏出手机开始玩贪吃蛇——2000年最流行的手机游戏。
压力测试进行到二十分钟时,第一个问题出现了。
“[12:25] 用户47发送失败,错误代码:503 服务不可用。”
罗斌立刻调出错误日志:“网关返回503,应该是触发了限流。”
“暂停测试。”陈溯说,“检查网关的限流策略。”
李明调出移动的测试网关文档:“文档上说,单IP每分钟限60条。我们的测试IP现在发了多少?”
罗斌查看统计数据:“58条。还没到上限。”
“那为什么503?”
“可能是网关内部的其他限制。”李明说,“或者……我们的请求频率分布不均匀,某一秒突增触发了保护机制。”
陈溯思考了几秒:“修改脚本,在请求之间增加随机延迟,模拟真实用户的不规律性。”
“改代码要时间。”罗斌说。
“要多久?”
“二十分钟。”
“抓紧。”
罗斌开始修改脚本。张浩凑过去看:“你这么改不对,应该在循环外面加延迟……”
“你懂?”罗斌终于抬头看他。
“当然懂。”张浩得意,“我大学学过编程。”
“那你来。”罗斌让开位置。
张浩坐下,手指在键盘上敲了几下,然后停住了。他盯着代码,额头上开始冒汗。
“这……这语法我没见过。”
“Python。”罗斌说,“1991年发布的语言,现在国外很流行。”
张浩脸色涨红,站起来:“花里胡哨的,用C语言不行吗?”
“测试脚本用Python效率更高。”罗斌重新坐下,“不懂就别乱说。”
陈溯看着这一幕,心里对张浩有了判断——眼高手低,基础不扎实,还爱显摆。张伟派这么个人来,可能不是想偷师,而是单纯找个地方打发亲戚。
但无论如何,这人不能留在核心团队。
“张浩。”陈溯说,“你去楼下买五瓶水,再带点午饭上来。钱我给你。”
这是明显的支开。
张浩愣了一下,脸色更难看了,但还是接过钱,悻悻地走了。
“这人不行。”李明直接说,“留在团队只会添乱。”
“我知道。”陈溯说,“但暂时不能赶他走。服务器是借他叔的。”
“那就让他打杂。”吴海波说,“别碰代码就行。”
三、机房危机
下午一点,修改后的压力测试重新开始。
这一次,请求分布均匀了许多,没有再触发网关限流。但新的问题出现了——服务器内存使用率持续升高。
“[13:15] 内存使用率:65%”
“[13:25] 内存使用率:78%”
“[13:35] 内存使用率:91%”
“内存泄漏。”李明判断,“我们的代码里有地方没释放内存。”
“找出来。”陈溯说。
四人开始查代码。几千行代码,要找到具体哪一处内存泄漏,像大海捞针。
罗斌写了个小工具,监控每个函数的内存分配和释放。半小时后,定位到了问题——处理短信内容的一个函数,每次调用都会分配一小块内存,但异常情况下没有释放。
“这个函数每小时会被调用几万次。”罗斌计算,“每次泄漏1KB,一小时就是几十MB。”
“修复。”陈溯说。
罗斌开始改代码。张浩回来了,拎着水和盒饭。
“吃饭了。”他把东西往桌上一放,自己先打开一盒吃了起来。
陈溯没动,盯着罗斌改代码。吴海波和李明也没动。
张浩吃了几口,发现没人理他,有些尴尬:“你们……不吃?”
“等会儿。”陈溯说。
下午两点,内存泄漏问题修复,压力测试第三次开始。
这一次,内存使用率稳定在45%左右,CPU使用率30%,一切正常。
“可以了。”李明说,“系统能撑住压力测试,实际用户量比这小得多。”
“但实际环境更复杂。”陈溯说,“用户可能发各种奇怪的内容,可能恶意攻击,可能……”
他话没说完,机房的门被猛地推开。胖子老板满头大汗跑进来:“停电了!”
“什么?”
“整栋楼停电!”胖子说,“供电局检修,说是两个小时!”
陈溯心里一沉。服务器有机房UPS(不间断电源),但只能撑半小时。半小时后如果还没来电,服务器会关机。
“为什么不提前通知?”
“我也是刚接到通知!”胖子擦汗,“你们快想办法,UPS报警了!”
陈溯冲向服务器。UPS面板上,电池电量显示还剩25%,预计续航时间18分钟。
“保存所有数据,准备关机。”他对吴海波说。
“测试数据还没保存完……”
“强制保存,然后关机。”陈溯说,“服务器不能非正常断电,会损坏硬盘。”
吴海波开始操作。罗斌也加入,两人手指在键盘上飞舞。
张浩站在一边,完全帮不上忙。
十五分钟后,所有数据保存完毕,服务器安全关机。
UPS电量还剩8%。
机房陷入黑暗,只有应急灯发出微弱的光。
“现在怎么办?”吴海波问。
“等。”陈溯说,“两小时。这两小时,我们做不了任何事。”
这是创业中最无奈的时刻——技术再强,也敌不过基础设施的脆弱。
四人回到二楼培训班。没有电,电脑用不了,风扇也停了,房间里很快闷热起来。
张浩第一个抱怨:“这什么破地方,连电都没有。”
“你不想待可以走。”陈溯说。
张浩不说话了,但脸色难看。
陈溯走到窗边,看着楼下。整条街都停电了,商铺关门,行人稀少。2000年的小城市,电网改造还没完成,停电是常事。
但对他们来说,每一次停电都是致命的。系统停运,用户流失,收入中断。
“我们需要自己的发电机。”李明说。
“买不起。”陈溯实话实说,“最便宜的柴油发电机也要上万。”
“那就租。”李明说,“重要时刻租一台,比如正式上线那天。”
陈溯想了想:“可以。正式上线那天,租一台发电机放楼下,以防万一。”
“还要考虑网络。”罗斌突然说,“停电可能只是开始,如果网络也断了……”
“移动的专线不会轻易断。”吴海波说,“但确实要做好预案。”
四人开始讨论应急预案。没有电,没有电脑,就用纸笔。陈溯在笔记本上写下:
应急预案:
停电:租发电机(日租500元)
断网:准备备用拨号上网(速度慢但可用)
服务器故障:准备备用机(张伟的服务器可作为备用)
数据丢失:每日备份到本地硬盘
写完这些,下午已经过去一半。
陈溯看着窗外的街道,突然意识到一个更深层的问题——他们现在的运营模式太脆弱了。所有的东西都集中在这个小城市的一个机房里,一旦出事,全盘皆输。
未来,系统必须分布式部署。服务器要在多个城市,要有冗余,要能自动切换。
但那需要钱,需要技术,需要时间。
现在,他们只能硬扛。
下午四点,电来了。
机房恢复供电,UPS开始充电。服务器重启需要时间,系统重新上线。
陈溯看着屏幕上的启动进度条,心里计算着损失:系统停运两小时,压力测试中断,今天的工作计划被打乱。
但这就是创业——永远有意料之外的事情发生。
四、端口开通
七月一日,早晨八点。
陈溯的手机响了,是赵明。
“陈溯,测试端口今天上午十点开通。”赵明说,“端口号106699001,网关地址我发你邮箱。记住,只能用这个端口做测试,不能商用。”
“明白。”陈溯说,“赵总,测试期有什么具体要求吗?”
“具体要求邮件里都有。”赵明说,“核心是三条:第一,不能有用户投诉;第二,不能有技术故障;第三,不能违规操作。三个月后,根据这三条评估。”
“好。”
挂断电话,陈溯立刻打开邮箱。赵明的邮件已经发来,附件里有详细的测试规范和评估标准。
他快速浏览。规范很细致:短信内容要健康,不能有色情、暴力、政治敏感内容;计费要透明,每条短信必须明确告知价格;退订要方便,用户发0000必须能退订所有服务。
评估标准更严格:用户投诉率不能超过0.1%,系统可用性要达到99.9%,每月要提交详细的运营报告。
“要求很高。”李明看完邮件说。
“但公平。”陈溯说,“高标准能筛掉那些想捞快钱的公司。对我们这种想做长久的,反而是机会。”
“现在的问题是我们没用户。”吴海波说,“测试期需要真实用户数据,但我们去哪找用户?”
陈溯早就想过这个问题:“从身边人开始。亲戚、朋友、同学,每人发一个测试账号,让他们试用,提意见。”
“这样……会不会太慢了?”
“慢,但稳。”陈溯说,“我们先做小范围测试,把系统打磨好,再考虑扩大。”

他拿出笔记本,开始列名单:
父母、几个亲戚、高中关系好的同学、吴海波培训班的学员、李明带的学生……
列了五十个名字。
“每人给一个测试手机号,让他们免费试用一周。”陈溯说,“但要说清楚,是测试,可能会有问题,请他们及时反馈。”
“谁来做客服?”吴海波问。
“我来。”陈溯说,“白天我在,晚上罗斌可以帮忙。周末李教授有空也可以。”
罗斌点头:“我可以。”
“那好。”陈溯说,“现在开始导入测试用户数据。”
吴海波开始操作。后台管理界面,用户列表从0开始增长:1,2,3……50。
五十个测试用户,对应五十个虚拟手机号——这些都是他们买的神州行卡。
上午十点整,端口正式开通。
陈溯用第一个测试号发短信:“XZ 双子座”。
五秒后,回复来了:“双子座今日运势:思维活跃,适合学习新知识。工作上可能有意外机会。幸运数字:7。”
成功。
他又测了天气、笑话、新闻。全部正常。
“通知所有测试用户。”陈溯说,“系统开始测试,请他们试用。”
吴海波群发了短信。很快,后台开始收到真实用户的请求。
用户1:“TQ BJ”
用户3:“XZ 天蝎座”
用户5:“笑话”
系统稳定运行,响应时间保持在3-5秒。
陈溯盯着监控界面。CPU使用率15%,内存45%,网络流量平缓。一切正常。
但不知为什么,他总觉得不踏实。
太顺利了。
创业就像走钢丝,顺利的时候往往是最危险的时候——因为你会放松警惕。
五、第一次警报
下午两点,第一个用户反馈来了。
是陈溯的高中同学,班长:“陈溯,你们这个星座运势准不准啊?我是白羊座,它说我今天会遇到贵人,但我一上午都在家看电视。”
陈溯回复:“这是通用文案,仅供参考。谢谢反馈,我们会优化。”
紧接着第二个反馈,来自吴海波的培训班学员:“笑话不好笑,能不能更新点新鲜的?”
第三个反馈,来自李明的学生:“天气数据好像滞后了,说今天晴天,但实际下雨了。”
问题开始暴露。真实用户的需求,比他们想象的要细致,要苛刻。
陈溯一一记录,分类整理:
内容类问题:文案质量、数据准确性、更新频率。
体验类问题:响应速度、操作便捷性、退订流程。
功能类问题:缺少个性化推荐、不能定制内容、没有历史记录。
“这些问题,试点评估不考核。”吴海波说,“我们不用管吧?”
“要管。”陈溯说,“虽然评估不考核,但用户满意度会影响口碑。如果我们想长期做,就必须把体验做好。”
“但时间不够。”李明说,“三个月,我们要同时做技术优化和体验优化,人手不够。”
“分优先级。”陈溯说,“技术优化优先,保证系统稳定。体验优化做最核心的:更新笑话库、优化天气数据源、增加个性化选项。”
“个性化选项怎么做?”
“很简单。”陈溯说,“用户第一次订阅时,记录他的星座、所在城市。之后发短信就不用带参数了,直接回复个性化内容。”
“这个要改代码。”罗斌说。
“改。”陈溯说,“今天晚上就改,明天上线。”
下午四点,系统运行六小时,累计处理短信312条,零故障。
陈溯稍微松了口气。但他知道,真正的考验还没来——用户量扩大后,系统能否承受?遇到恶意攻击怎么办?出现重大bug怎么快速修复?
傍晚六点,第二个警报来了。
这次不是用户反馈,而是系统监控告警。
“[18:05] 检测到异常流量,来源IP:218.76.xxx.xxx,请求频率:每秒20次,持续30秒。”
罗斌立刻调出日志:“又是攻击。这次换了个IP,手法类似,但更隐蔽——每次请求内容都不同,规避了简单的内容过滤。”
“封IP。”陈溯说。
“已经自动封了。”罗斌说,“但我查了下,这个IP是省城的。可能是同行测试,也可能是……”
“是什么?”
“也可能是移动内部的测试。”罗斌说,“他们想看看我们的防护能力。”
这个可能性很大。试点期,移动肯定会测试各家的系统稳定性和安全性。
“加强监控。”陈溯说,“所有异常流量都记录,分析模式。”
“已经在做了。”罗斌说,“但我发现一个问题——我们的防护脚本是手动的,每次攻击来了才封IP。应该做成自动的,实时分析,实时封禁。”
“你需要多久?”
“写自动化脚本,至少两天。”
“太久了。”陈溯说,“先用手动,同时写自动化。李教授,您能帮忙吗?”
李明点头:“我和罗斌一起做。”
晚上八点,测试用户陆续下班放学,短信量进入高峰期。
后台数据开始快速跳动:
“[20:15] 当前在线用户:32”
“[20:30] 当前在线用户:41”
“[20:45] 当前在线用户:37”
系统负载也在上升,CPU使用率最高达到45%,内存55%,但还在安全范围内。
陈溯盯着监控界面,像盯着重症监护室的病人。每一个指标的波动,都牵动他的神经。
吴海波煮了第二壶茶。张浩早就走了,说是“家里有事”,但大家都知道他是不想加班。
晚上九点,罗斌突然说:“又有攻击。”
这次是三个IP同时发起,请求频率不高,但内容经过精心设计——每条短信都包含特殊字符,试图触发系统的解析漏洞。
“手动封禁来不及了。”罗斌说,“三个IP同时来,而且它们在轮换——一个被封,另一个立刻接上。”
“能看出攻击目的吗?”陈溯问。
“像是在找漏洞。”罗斌分析,“他们发的每条短信都不同,测试各种边界情况:超长内容、特殊编码、非法字符……”
“移动的测试?”吴海波问。
“不像。”罗斌说,“移动的测试会更规范。这种更像是……竞争对手。”
这个词让房间里的空气凝重起来。
如果真是竞争对手,意味着他们已经被人盯上了。试点还没正式通过,就有人想把他们搞垮。
“加强防护。”陈溯说,“今晚轮流值守,我和罗斌第一班,李教授和吴老师第二班。”
“好。”
晚上十点,攻击突然停止了。
三个IP同时消失,就像从来没出现过。
但陈溯知道,这只是开始。
对方在试探,在收集信息。下一次攻击,会更猛烈,更致命。
他走到窗前。夜色深沉,街上行人稀少。
2000年的夏天夜晚,安静得能听到蝉鸣。
但在这安静之下,暗流已经开始涌动。
溯光科技的第一个产品,还没正式上线,就已经进入了战场。
陈溯握紧了手机。
三个月。他必须在这三个月里,让系统足够强大,足够稳定,足够安全。
否则,一切都会在摇篮里被扼杀。

![[重生2000:重启时代引擎]节选试读](https://image-cdn.iyykj.cn/2408/016175f76e3646ca18a017bccbe5923c.jpg)