第 7 章
伺服器宕机之日
2006年11月17日,一份四页纸的备忘录从任天堂网络基础设施团队发往北美运营部。文件标题为“WiiConnect24北美服务器容量评估(最终版)”,首页右上角标注着签发日期。这份文书在接下来的四十八小时内,依次流经企划本部、市场推广部与北美总裁办公室,每一处都留下了页边签批的痕迹。
山上仁志是任天堂网络服务部门的负责人,在任天堂工作了十九年。他参与过超级任天堂的卫星广播系统开发,那是任天堂第一次尝试通过卫星向游戏机传输数据。在Wii项目启动前,他的部门只有十二个人,负责维护GameCube那几乎无人问津的在线服务。
Wii给了这个部门扩张的理由——编制扩充到四十五人,一半做硬件端的网络模块,另一半做服务器端架构。真正负责服务器端运维的工程师,不到二十人。
2005年秋天,山上提交过一份服务器扩容计划,申请在北美和欧洲各部署三个数据中心,以应对Wii首发后的流量。这份计划在预算会议上被否决了。
财务部门的理由是GameCube的在线服务数据——那组数据表明,为游戏机的联网功能大规模投资基础设施,回报率无法预测。竹田玄洋在会上为山上说了几句话,但Wii的体感控制器在量产前最后三个月还在修改灵敏度算法,他的注意力不在服务器机房。
山上拿不到预算,只能用GameCube时代的流量模型做规划,加上百分之五十的冗余,部署在租用的西雅图托管机房和法兰克福镜像节点上。凌晨两点,西海岸的激活高峰与东海岸的持续流量叠加在一起。一个新部署的负载均衡器因为配置错误,将等待队列中的用户全部踢出系统。那些排了十八个小时买到机器、又在虚拟队列里等了四十分钟的玩家,突然看到屏幕上弹出一行代码:错误代码51330。
接下来的七十二小时里,51330成了一个在游戏论坛上被反复提及的数字。任天堂北美客服中心在十一月二十日接到了创纪录的来电数量,客服手册上还没有关于这个错误代码的详细解释,接线员只能告诉用户“请检查网络设置,稍后再试”。用户在NeoGAF论坛上发帖,标题是“我买到了一台Wii,但我连不上Wii”——帖子在六小时内被回复了数百页。
但这场技术灾难没有演变成公关危机。原因很简单:Wii的蓝海用户不知道自己遇到了问题。
那些任天堂费尽心思请进客厅的祖父母、父母、从不玩游戏的兄弟姐妹,他们买回Wii,插上电源,插上网线,看到屏幕上提示“连接失败”,然后把光盘放进光驱,开始玩《Wii Sports》。他们不知道天气预报频道应该是什么样子,因为他们从未见过天气预报频道。他们不知道Virtual Console可以下载超级任天堂游戏,因为他们买这台机器是为了打网球和保龄球。他们不愤怒,不打电话给客服,不上NeoGAF发帖。他们只是安静地离线玩着。
这是Wii奇迹中最残酷的讽刺。任天堂的在线服务在首发夜崩溃了,但它的核心用户群根本没有注意到。
那些在论坛上愤怒声讨的,是传统玩家——他们知道一台联网的游戏机应该是什么样子,因为他们用过Xbox Live,知道微软的服务器在Halo 2首发时也崩溃过,但至少微软的账号系统可以跨设备登录。他们质问的不是连接失败,而是连接失败背后的东西:为什么Mii不能导出?为什么Virtual Console游戏绑定在一台机器上?
为什么没有账号系统?这些质问指向了一个结构性问题。Wii的频道系统是一个封闭的花园。每一个频道——天气预报、新闻、照片、购物——都由任天堂自己开发、自己部署、自己控制。第三方开发者无法在这个平台上创建新的频道,用户无法自定义频道内容,连Mii形象的导出和分享都受限于任天堂的服务器。这个封闭性的设计哲学可以追溯到横井军平的Game Boy:用成熟廉价的技术,创造简洁直观的体验,一切都在任天堂的掌控之中。横井的Game Boy不需要第三方来定义它的使用场景,Wii的频道系统延续了同样的逻辑。
但互联网不是Game Boy卡带。互联网的价值在连接节点的数量上呈指数增长,每一个新增节点都会与已有节点产生交互。这个规律决定了,一个成功的联网平台最终必须向第三方和用户开放——不是因为开放是道德上正确的,而是因为封闭系统的增长天花板远远低于开放系统。
任天堂的硬件工程师们不是不懂这个道理,而是他们的职业生涯一直在做一件事:设计一台完整的、从芯片到外壳都由自己掌控的专用游戏机。Wii的每一项设计——从Mii的捏脸界面到Wi-Fi模块的选型——都体现了对完整性的追求。但联网服务需要的不是完整,是弹性。
山上仁志在京都时间凌晨四点到达总部。他调出北美服务器的实时监控数据,发现了一个在所有测试中从未出现过的变量:WiiConnect24的待机连接功能。Wii即使主机关机,只要电源线插着,默认设置下会维持与服务器的低强度通信,每隔一段时间发送心跳信号。这个功能的硬件设计考虑的是用户体验——让玩家在下次开机时不用等待网络初始化——但硬件团队没有把这个心跳信号的频率和开销同步给网络服务部门。在GameCube时代,没有待机联网功能,所以GameCube的流量模型里根本没有这个变量。
几十万台Wii,主机关机,心跳信号持续发送,每一个信号都需要服务器响应。这是组织问题,不是技术问题。
在京都总部,硬件、软件、网络服务分属不同部门,部门之间的信息传递需要经过管理层。在Wii的开发周期里,体感控制器的调试、主机外观的定稿、首发游戏阵容的确定,占据了管理层几乎全部的注意力。网络服务不在那个优先级列表里。
山上在事后复盘时发现,如果WiiConnect24的待机心跳频率降低一半,首发夜的峰值负载可以减少百分之十五。这个数字不会完全避免崩溃,但可以让排队机制有足够的缓冲时间上线。但这个信息在开发阶段从未被传递到网络服务部门。
十一月二十一日,首发四十八小时后,北美Wii的激活总数超过六十万台。任天堂未公布联网率,但雷德蒙德运营中心的内部数据显示,至少四十五万台主机在这四十八小时内尝试过联网,连接率超过百分之七十。
这组数据没有被公开,但它的含义是清晰的:GameCube时代的流量模型在Wii发布的第一天就失效了。四十五万用户中,大约有三分之一遇到了显著的服务延迟或连接失败。
错误代码51330的谷歌搜索量在十一月二十日短暂超过了“Wii”本身。十二月,服务器逐渐稳定。
山上仁志的团队在七十二小时里学到了比过去两年加起来都多的东西。他们紧急扩容了北美服务器集群,重写了排队机制算法,修复了负载均衡器的配置错误,把天气预报频道的自动更新时间从凌晨两点改到凌晨四点。他们还在京都总部召开了一次事后复盘会议,提交了一份三十二页的事故报告,详细列出了从容量规划错误到跨部门沟通缺失的所有问题。
岩田聪参加了部分会议。他问山上:如果Wii的联网用户增加到一千万,目前的架构能不能支撑?山上回答:不能。
岩田点了点头,指示企划本部成立一个专门的工作组,负责制定Wii在线服务的长期路线图。这个工作组在一月召开了第一次会议,讨论的核心议题是:任天堂应该如何建立一个真正的账号系统,让用户的购买记录、Mii形象、游戏存档可以跨设备同步。
会议记录显示,与会者讨论了微软的Xbox Live模式,讨论了索尼正在开发的PlayStation Network,讨论了苹果的iTunes账号系统。他们画出了各种架构图,比较了各种技术方案。
但这项讨论最终没有产生任何实质性的改变。原因不是技术上的。建立一个真正的账号系统,意味着任天堂必须承认游戏机不再是孤立存在的硬件,而是连接到云端的终端。这意味着任天堂必须运营一个像电信公司一样复杂的网络服务平台,而不是像玩具公司一样卖了机器就完成交易。这意味着任天堂的组织结构、企业文化、盈利模式都要发生根本性的改变——从一次性交易变成持续服务,从硬件思维变成平台思维,从封闭控制变成开放生态。
Wii的在线服务之所以脆弱,不是因为山上仁志的团队不够优秀,而是因为任天堂整个公司对“联网”这件事的理解,仍然停留在GameCube时代。在2006年12月,这个认知的代价还看不见。Wii的销量势如破竹。
十二月圣诞季,任天堂在北美的出货量被一扫而空,零售商在电话里用近乎恳求的语气追加订单。雷吉在十二月接受《连线》杂志采访时提到出货量,措辞里透着一种他自己都未必意识到的意味。在日本的秋叶原,电器店门口挂出的“Wii入荷”告示牌每次出现都会在几小时内被抢购一空。在欧洲,Wii的预订名单在十几个国家排到了2007年春天。Wii在十二月成为美国历史上销售速度最快的游戏机,单月销量超过Xbox 360和PlayStation 3的总和。
这场胜利掩盖了一切。服务器宕机变成了一个短暂的技术故障,一个事后可以用来开玩笑的小插曲。雷吉在2007年1月的一次媒体圆桌会上被问到首发夜的网络问题,他的回答带着惯常的自信。他说,他们低估了玩家对Wii的热情,包括联网的热情。他咧嘴笑了笑,补充说,这是一个令人愉快的错误。
“令人愉快的错误。”这句话可以被用来概括任天堂在2006年末到2007年初的整个心态。
Wii的蓝海战略成功了,成功到所有人都忘记了蓝海本身没有护栏。当数以百万计的新用户涌入任天堂的花园时,他们带来了巨大的销量和利润,也带来了任天堂从未面对过的需求——把自己变成一个平台。一个真正的平台,不是由任天堂单方面定义用户能做什么,而是由用户和第三方开发者共同定义平台能做什么。
任天堂的服务器准备好了——在七十二小时的噩梦之后,山上仁志的团队把容量扩充到了可以支撑数百万用户——但它的组织、文化和战略都没有准备好。
2007年1月,在拉斯维加斯消费电子展上,微软的彼得·摩尔举起了一台没有光盘驱动器的Xbox 360原型机。在同一场展会的另一侧,苹果的工程师们正在展示iPhone的多点触控屏幕,一个简单的滑动操作就能让屏幕上的方块消除。在京都,任天堂总部,山上仁志的团队正在为Wii的下一个在线更新做准备,他们计划在春天推出“大家投票频道”和“Mii竞赛频道”,继续用横井式的简洁设计填充那个封闭的花园。
这三件事当时没有被任何人放在一起看。但结构性的力量不依赖于被看见。
WiiConnect24的崩溃暴露了一个事实:任天堂用Wii迈出了游戏机全天候联网的第一步,但这一步走完,它发现自己站在一个完全陌生的领地上——联网设备最终必然要完成从封闭花园到开放平台的进化,而任天堂没有能力也没有意愿完成这个进化。它的组织是为制造专用硬件优化的,不是为运营网络服务优化的。它的设计哲学是为控制用户体验优化的,不是为容纳第三方创新优化的。它的盈利模式是为一次性交易优化的,不是为持续服务关系优化的。
在2006年11月19日午夜,这些还没有显形。雷吉站在时代广场的路边,看着那些抱着白色包装盒走向地铁站的玩家。他们的脸上带着一种在凌晨寒风中排了十八个小时后终于得偿所愿的表情。
雷吉的手机再次响起,雷德蒙德运营中心的值班主管说,情况正在好转,排队机制恢复了稳定,东海岸的峰值正在回落,但西海岸的浪头还在涌来。雷吉问,用户知道吗?
但雷德蒙德运营中心的值班日志里,有一条记录从未被写进那份三十二页的事故报告。
凌晨一点四十七分,负责监控西雅图托管机房温度传感器的技术员发现,三号机柜的温度在十二分钟内上升了四摄氏度。这不是因为制冷系统故障——空调运转正常,出风口温度恒定。升温的原因很简单:刀片服务器的处理器负载从百分之四十三飙升到百分之九十七,风扇全力运转,热量堆积在机柜后部的空隙里,形成了一个在机房平面图上被标记为“热点3C”的狭窄区域。技术员按照标准流程调高了该区域的送风强度,在值班日志里记下一行例行公事的备注。
但四十分钟后,三号机柜里一台负责处理Mii形象上传请求的服务器触发温度警报,自动降频运行。那些在凌晨时分耐心捏制自己虚拟化身的新用户——西海岸的数千个家庭,家长已经睡了,孩子们在客厅里压低声音对着电视屏幕调整发型和眼睛形状——突然发现保存按钮转了整整一分多钟,然后弹出一条他们不理解的消息。大多数孩子选择了按A键重试。少数人关掉了电视。
这不是整个系统中最严重的故障。最严重的故障发生在东海岸凌晨五点半,当负载均衡器错误踢出用户的同时,负责处理Virtual Console购物频道的数据库服务器发生了一次短暂的锁表。原因是一个开发阶段留下的调试脚本在特定条件下被触发,开始对购买记录表执行全表扫描。这个脚本的注释栏里写着“临时调试用,上线前删除”——2006年8月17日,一名初级工程师在代码审查截止日期前提交了这行注释,然后所有人都忘了这件事。锁表持续了九分钟。在这九分钟里,任何试图购买Virtual Console游戏的用户都会被引导到一个通用的错误页面,页面上画着一个困惑的Mii形象,下方写着一行在日后将成为早期Wii用户集体记忆的文案:“无法完成购买。请稍后再试。如果问题持续,请查看任天堂官方网站的支持页面。”但在2006年11月19日凌晨五点半,任天堂官方网站的支持页面还没有关于这个错误的说明。
山上仁志在凌晨三点三十五分被手机铃声惊醒时,京都的气温已经降到了十一月应有的水平。他住在宇治市的一栋独栋住宅里,从卧室窗户可以看见平等院凤凰堂的屋顶轮廓。他的妻子在铃声响到第三声时翻了个身。山上接起电话,对方是西雅图机房的值班工程师,英语带着浓重的日本口音——他是在华盛顿大学读完硕士后加入任天堂北美分部的第二代日裔,姓田中。田中告诉他,情况比十五分钟前汇报的更糟。西海岸的激活请求已经形成了第二次波峰,原因是加州和华盛顿州的玩具反斗城门店刚刚完成了午夜首发活动,数千台Wii在同一个小时被插上电源、接上网线。这些新激活的主机几乎同时在下载系统更新、创建Mii、尝试连接购物频道——每一个行为都对应一组数据库写入操作。田中在电话里说了一句山上至今记得的原话:“这不像GameCube。这甚至不像我们做的负载测试。这像是整个西海岸在同一秒按下了开机键。”
山上在挂断电话后没有立刻出门。他坐在床沿上,打开笔记本电脑,远程登入西雅图机房的监控面板。屏幕上跳出的数字让他明白了田中的意思。在正常负载下,WiiConnect24的用户认证服务器每秒处理大约三百到五百次请求。负载测试时,他们把压力上限设在每秒两千次,认为这已经足够覆盖最极端的情况——这个判断的依据是GameCube时代在线服务的峰值数据乘以二点五倍。此刻屏幕上显示的数字是每秒三千八百次,而且曲线仍在以近乎垂直的角度攀升。认证服务器的响应时间从正常的二百毫秒延长到了四千毫秒以上,这触发了Wii主机端的超时重试机制——每一台连接失败的主机会在三秒后自动重新发送请求。这意味着那些已经被踢出队列的用户,正在无意中向服务器发起第二波攻击。
这就是负载均衡器崩溃的真正原因,不是硬件故障,不是恶意攻击,而是一个在设计阶段从未被预见的循环:新用户不理解错误信息,选择重试;系统因超载延长响应时间;重试请求堆积在队列里;负载均衡器判定后端服务器无响应,将整个队列清空;用户再次看到错误代码,再次重试。山上后来在他的个人笔记里写道:“我们设计了连接,但没有设计连接失败时的用户行为。”这句话在十年后被一位研究人机交互的年轻博士生从任天堂的内部档案里翻出来,写进了一篇关于“善意循环导致系统崩溃”的论文。但在2006年11月19日的凌晨,山上只是在笔记本电脑的屏幕光里沉默了三分钟,然后合上电脑,穿上外套,开车驶过凌晨空旷的京滋bypass,前往京都南区上鸟羽的任天堂总部。他到达时,导航系统上的时间显示为凌晨四点零二分。停车场里已经停着四辆车——他的团队里住得最近的几个人比他先到了。
在总部的网络运营室,白板上贴着一张Wii北美首发的时间进度表,从东海岸的午夜到西海岸的凌晨三点,每一个时区的激活窗口都用不同颜色的马克笔标注。这张表是在一周前贴上去的,当时所有人都认为最危险的时段已经过去——东海岸的零点峰值在凌晨一点左右回落,中西部在凌晨两点后逐渐平缓。没有人预料到加州和华盛顿的门店会有第二波独立峰值,因为任天堂的市场部从未在首发计划中明确标注玩具反斗城西海岸门店的午夜特别场次。这是市场推广部和网络服务部之间的又一个信息断层。市场部知道这些门店的促销计划,网络服务部不知道。山上的团队在部署服务器集群时,假设美国的时区差异会导致激活请求自然分散在四个小时的时间窗口内。实际上,东海岸和西海岸各有一个集中的激活波峰,中间夹着两个小时的相对平静,然后两个波峰在凌晨两点——当东海岸的持续流量与西海岸的初波叠加时——交汇在一个点上。
这个点就是错误代码51330诞生的时刻。山上仁志事后在事故报告中写下了一段措辞克制的分析:“本报告所指出的容量规划错误,根源在于组织内部对Wii用户行为模式的假设未能及时更新。GameCube时代的在线服务数据不足以作为WiiConnect24的规划依据。我们低估了三件事:蓝海用户的好奇心、待机连接的心跳频率、以及美国零售体系在首发夜制造同步需求的能力。”报告中没有提到的是,他在2005年秋天的预算会议上曾经预感到这个结果。他的预感没有数据支持——在2005年,没有人有任何数据可以支持对Wii联网需求的预测,因为Wii要面对的那些用户还从未出现在任何游戏机的在线服务统计里。山上只能用GameCube的数据做推论,因为那是整个任天堂唯一可用的参照系。这是蓝海战略的内在悖论:你要为一群从未出现过的人设计产品,但你在设计阶段只能基于已经出现过的人的数据做决策。
当雷吉在时代广场把那份揉皱的备忘录扔进垃圾桶时,他并不知道山上仁志此刻正坐在京都总部的运营室里,对着同一份电子文档的PDF版本做最后的批注。山上的批注没有使用雷吉那种市场推广式的措辞。他在文档末尾加了一行小字:“本次事故暴露的不仅是容量问题。Wii的频道架构在数据层与硬件序列号深度绑定,任何未来的账户系统迁移都需要对现有数据库结构进行根本性重构。这个重构的难度会随着激活主机数量的增长呈指数级上升。建议在2007年第一季度之前启动架构重构项目。”这行批注的日期是2006年11月21日。2007年第一季度结束前,Wii的全球销量突破了一千万台。架构重构项目从未启动。山上在2008年调任至第三方关系部门,他留下的那份批注,最终被归档在任天堂内部知识库的一个子目录下,目录名是“WiiConnect24初期运维记录”。此后八年,这个目录的访问记录为零。
值班主管说,大多数不知道,他们只是在玩《Wii Sports》。雷吉挂断电话。第五大道的风从中央公园方向吹来,带着十一月纽约特有的寒意。他把手插进口袋,摸到了那份四页纸的备忘录。页角已经被折叠磨损,字迹在路灯下辨认不清。他站了一会儿,把那份备忘录揉成一团,扔进了路边的垃圾桶。然后他转身走回店里。Wii首发夜的服务器崩溃在任天堂的官方叙事里被记录为一次技术故障,一个在后续更新中已经解决的问题。但它的真正意义不在于技术,而在于它所揭示的结构性错配。任天堂用Wii在客厅打赢了电子游戏史上最漂亮的一场战役,把游戏人口从核心玩家扩展到了几乎所有人。但这场胜利的代价,是让它错过了构建一个跨设备平台的窗口期。当任天堂的工程师们在京都总部为Wii频道的封闭花园添砖加瓦时,另一些公司正在为另一个完全不同的未来铺设管道——在那个未来里,游戏不需要专用硬件,软件不需要光盘,用户不需要坐在电视机前,而“联网”不是一项可选功能,而是设备存在的全部意义。
那个未来在2006年11月19日午夜还没有到来。但它在雷德蒙德运营中心那条绿色曲线的陡升里,在错误代码51330的闪烁里,在山上仁志被手机铃声惊醒的凌晨三点三十五分——已经悄然成型。任天堂用WiiConnect24把游戏机变成了全天候设备,这一步迈出去,就无法收回。但接下来必须完成的进化,会被交给另一些人,另一些公司,另一些在2006年11月还默默无闻的名字。客厅的溶解从那个午夜开始,而口袋与云端的时代,正在地平线以下蓄积它的第一次浪潮。