第46章 山海的压力测试(第1页)
二月七日,凌晨一点。深圳南山,创新大厦五楼东侧的玻璃房里,空气凝固得像一块冰。十六台高配电脑屏幕亮著,十六双眼睛盯著屏幕,但没人说话。只有伺服器风扇全速运转的轰鸣声,像某种巨大野兽垂死前的喘息,在密闭空间里迴荡。
屏幕上是“山海”压力测试的监控面板。左侧是实时数据:在线人数8,427,还在缓慢增长;帧率28fps,勉强可玩;网络延迟112ms,偏高但可接受。右侧是资源占用:cpu97%,內存89%,资料库连接池占用100%。所有指標都在危险边缘跳舞。
阿坤坐在监控台前,背挺得笔直,但手在抖。他眼镜片上反射著屏幕的光,那些跳动的数字像心电图,显示著“山海”这个新生世界的脉搏——虚弱,但还在跳。他已经四十八小时没合眼,下巴的胡茬青黑一片,眼里的血丝像蛛网。
“一万了。”王磊的声音从身后传来,很轻,但在一片死寂中像炸雷。
在线人数突破一万。这是“山海”偽3d引擎的第一次万人同图测试,目標是在简陋硬体(模擬2003年主流配置:赛扬1。7ghz,256mb內存,英特尔845g集显)上,跑出流畅的体验。测试用户是浩宇从《血战天下》老玩家里招募的志愿者,两千人,加上八千个模擬机器人。伺服器是刚採购的戴尔poweredge2650,四路至强,16gb內存,在2004年算是顶配。
但现在,顶配伺服器在呻吟。
“资料库响应时间突破500毫秒了。”张一鸣盯著另一个监控界面,声音平静,但眉头紧锁,“索引命中率在下降,有全表扫描的跡象。我们的查询优化器可能有问题。”
“关掉非核心服务。”阿坤说,声音嘶哑,“邮件系统、排行榜、聊天频道,全部停掉。集中资源保核心玩法。”
“已经在做了。”赵永在另一台机器上快速操作,“但资料库连接池满了,新请求在排队。等待队列已经积压了三千多个查询。”
“清连接。把閒置超过三十秒的连接踢掉。”
“踢了,但新连接建立需要时间,玩家会感觉卡。”
“顾不上了,先保住伺服器不崩。”
玻璃房里键盘声密集起来,像暴雨敲打铁皮屋顶。每个人都在自己的终端上操作,关服务,调参数,杀进程。但屏幕上的数字还在恶化:cpu99%,內存92%,资料库响应时间突破800毫秒。
凌晨一点四十七分,第一波玩家掉线。世界聊天频道(还没关掉的部分)开始刷屏:
“卡死了!”
“动不了!”
“技能放不出来!”
“伺服器炸了?”
阿坤的手指在键盘上飞舞,调出资料库慢查询日誌。日誌在疯狂滚动,每秒新增几百条。他快速扫描,锁定一个查询:
select*fromplayer_itemswhereplayer_id=?anditem_typein(?,?,?,?,?,?,?,?,?,?)orderbycreated_atdesclimit50
“这个查询,”他指著屏幕,“player_items表有千万级数据,item_type有十个可能值,索引是(player_id,item_type),但in查询让索引失效了。全表扫描,每秒执行几千次,资料库不崩才怪。”
“谁写的?”王磊问。
“我。”陈默的声音从角落传来,很小,“物品系统我负责的。我想一次查出玩家所有类型的物品,减少查询次数……”
“想法没错,但实现错了。”阿坤快速改代码,“拆成十个查询,用union,或者用临时表。但现在来不及了,先加forceindex强制走索引。”
他改完,部署。三分钟后,资料库压力稍降,但cpu还是99%。
凌晨两点零八分,在线人数突破一万二。伺服器开始出现周期性卡顿:每三十秒,帧率掉到5以下,持续五秒,然后恢復。玩家骂得更凶了。
“是gc(垃圾回收)。”张一鸣调出jvm监控,“老年代內存满了,每次fullgc要五秒。我们的对象创建太频繁,特別是技能特效和伤害数字,每个都是独立对象,用完就丟。”
“用对象池。”阿坤说,“但现在改不了,先加大堆內存。”
“已经最大了,16g全给了java。物理內存不够了。”
“那就砍特效。同屏技能特效超过十个,后面的不显示。”
“在做了。”