从卡顿到秒开:地下城发布网两台服务器迁移的3个技术真相
去年11月,一个运营了四年的地下城发布网在晚高峰被玩家骂上了群公告。登录延迟从80ms飙到1400ms,频道切换要转圈十几秒,公会战当天直接掉了两百多个活人。站长连夜找我过去看,说迁移方案摆了三套,不敢动。说白了,这就是发布网架构选型的问题。
我花了一周时间把他们的老服务器拆了个遍,又搭了一套新环境做对比测试。数据出来那天晚上,站长看着压测报告沉默了很久。这个案例很典型,值得拿出来讲透——因为大多数地下城发布网的卡顿,根本不是带宽不够,而是架构从一开始就选错了。
方案A:单机大带宽,省钱但埋雷
他们原来的方案很常见:一台E5-2680v4、64G内存、独享50M带宽,放在镇江机房。登录服、频道服、数据服全塞在一台机器上,用Docker隔开。白天在线三四百人,流畅得不得了。站长当时还得意,说一年才六千块成本。
问题出在晚上八点到十一点。这个时间段同时在线会冲到一千二到一千五,频道切换请求是白天的七倍。所有请求打在同一块网卡上,内核协议栈的软中断把CPU单核吃满——注意是单核。Linux默认的RPS(Receive Packet Steering)没开,网卡收到的包全压在CPU 0上处理,其他七颗核在围观。这个机制很多人不知道,但恰恰是单机方案在高峰期的致命伤。
我看过他们压测时抓的perf数据:ksoftirqd进程CPU占用87%,协议栈处理耗时占到了总延迟的63%。这意味着什么?你加再多带宽也没用,包进来先卡在内核里排队。
方案B:三节点分离+内网数据分发
后来我给的方案是把登录服、频道服、数据服拆到三台机器上,放在同一个机房的内网里。登录服扛连接握手和账号校验,频道服处理频道切换和广播,数据服只管角色存档和物品流水。三台机器用万兆内网交换机互联,对外只暴露登录服的20M带宽。
这个架构的核心思路是:把高并发短连接和低并发长连接分开处理。频道切换是典型的高并发短请求,每次切换要读频道列表、校验权限、广播状态,单次耗时短但频次极高。而数据服是低频但每次读写量大的操作。混在一起,短请求被长请求的磁盘IO拖住,长请求又被短请求的CPU竞争挤掉。
分离之后,频道服的网卡中断只处理频道相关的小包,CPU 0的压力从87%降到23%。迁移完第一周,晚高峰平均登录延迟稳定在45ms以内,频道切换从平均3.2秒降到0.4秒。说实话,这个数字我一开始都不敢信,重复测了三遍。
这套方案的代价是成本翻倍:三台机器加万兆交换机,一年大概一万四。但站长的原话是——“早一年知道这个,少被骂三百天。”
优劣对比:不是配置越高越好,是数据流要分家
两种方案放在一起看,差异非常明显。
- 单机方案:成本低、部署快、白天体验好,但晚高峰必崩。根因不是硬件不够,是协议栈软中断单核瓶颈叠加混合负载互相拖累。
- 三节点方案:成本翻倍、部署需要半天到一天、需要重新规划内网拓扑,但高峰表现稳定,且后续扩容灵活——频道服不够就单独加频道服,不影响其他节点。
那是不是所有地下城发布网都得直接上三节点?也不尽然。如果你日常在线从没超过五百人,单机加上开启RPS、绑核、调整网卡队列数量,完全够用。但如果你预期会冲到八百以上,或者已经出现晚高峰卡顿,别犹豫,拆。
有个细节值得单独说:迁移的时候不要一次性切过去。用Nginx做流量灰度,先切10%的登录请求到新架构,观察三天,再逐步放量。他们当时就是太急,某天凌晨两点直接全量切,结果登录服的Redis密码配置写错,早晨六点爆了一波登录失败,又被骂了一次。
发布网选型的判断标准,就三条
经历这次迁移,我总结了一个简单的判断框架。你去看任何一个地下城发布网的技术方案,就问三个问题:
第一,登录和频道是不是分开处理?没分开的,在线人数一过阈值必然出问题。第二,数据服有没有独立存储,还是和频道服共用一个磁盘?共用的,高峰时频道切换会被存档写入卡住。第三,有没有做过协议栈优化——RPS、网卡队列、软中断绑核,这三样缺一个,就是在用单核硬扛全站的包。
坦白讲,大部分发布网的技术文档不会写这些。你得问站长,或者自己登进去在高峰时段体感测试。频道切换低于0.5秒是及格线,超过一秒基本就是架构有问题。
回到开头那个案例。迁移完成后的第三个周末,他们搞了一次公会战活动,同时在线冲到一千七。服务器监控屏上CPU负载最高45%,内网流量跑到6.8Gbps,登录服连接数一万二,一切平稳。站长在群里发了个红包,备注写的是“谢谢不卡”。
这就是技术方案选对和选错的差别。地下城发布网的体验好坏,从来不是玄学,就是几个关键架构决策的叠加结果。你选对了,玩家留得住;选错了,再高的配置也救不了晚高峰。