游戏服务器是服务器选型里最"挑食"的一类:它不像网站那样可以多核分摊请求,很多游戏逻辑是单线程跑帧循环的,主频高一点体验就好一截;它也不像下载站那样只看带宽总量,玩家掉线一次就可能流失。更麻烦的是,游戏服一旦上线,配置改起来比网站麻烦得多——分区分服、数据迁移、玩家数据一致性都要考虑。
这篇文章按游戏服的实际架构来讲配置:先讲清网关服、逻辑服、战斗服、数据库服各自干什么和怎么配,再讲 CPU 为什么优先看主频而不是核心数、内存怎么按在线人数估算、不同游戏类型对延迟的敏感度差多少、带宽怎么按每玩家每秒数据量算,最后是 UDP 与 TCP 的选择、抗 DDoS 需求、部署形态对比和压测扩容方法。数字均为经验量级,实际以压测为准;价格为定性描述,以服务商官网为准。
一、先理解游戏服的架构分工
不同类型的游戏架构差异很大,但中大型多人在线游戏通常会拆成几类进程,每类对硬件的诉求完全不同:
| 进程类型 | 职责 | 硬件侧重点 | 是否可横向扩展 |
|---|---|---|---|
| 网关服 | 承载玩家连接、加解密、转发消息、限流 | 网络 IO、连接数、中等 CPU | 容易,可多加 |
| 逻辑服 / 场景服 | 房间逻辑、AI、状态同步、业务处理 | 高主频 CPU、内存 | 按场景/房间拆分后可扩展 |
| 战斗服 | 实时对战的核心计算,帧同步或状态同步 | 最高主频、低抖动网络 | 按对局拆分 |
| 数据库服 | 玩家存档、道具、订单 | 内存(缓存热数据)、NVMe、可靠存储 | 难,靠主从和分库 |
| 中心服 / 匹配服 | 登录、匹配、排行榜、社交 | 中等 | 可做多实例 |
为什么这么拆
拆分的本质是让可并行的部分并行,让必须串行的部分独占资源。 战斗逻辑往往是单线程帧循环,一个进程跑一个房间或一组房间,多开进程分摊到不同核上;网关是无状态的,随便加机器;数据库最难扩展,所以要用缓存把热数据挡在前面。
对小团队来说不必一上来就全拆:初期可以把网关、逻辑、战斗合并部署,数据库独立即可。等在线规模上来再逐步拆分。
一个典型的进程拓扑
玩家客户端
|
| (UDP 或 TCP 长连接)
v
网关服 ×N(无状态,负载均衡接入)
|
v
逻辑服/场景服 ×N(按场景或房间分片)
|
+--> 战斗服 ×N(按对局分配,通常独占进程/线程)
|
+--> 缓存(在线状态、房间状态、热存档)
|
+--> 数据库(持久化存档、订单、日志)
|
+--> 匹配服 / 聊天服 / 排行榜(可独立)
关键点:战斗服和数据库服是性能瓶颈最常出现的地方,前者卡在单核主频,后者卡在 IO 和锁。
二、CPU:主频和单核性能比核心数更重要
为什么
多数游戏的逻辑帧循环是单线程的:每个 tick 要遍历所有实体、处理移动、碰撞、技能判定、状态同步。这个循环跑在一个线程上,无法靠加核心分摊。帧率(比如 20 Hz、30 Hz、60 Hz)决定了每个 tick 的预算时间:
- 30 Hz 意味着每帧只有约 33 ms 预算
- 60 Hz 意味着每帧只有约 16 ms 预算
如果单帧计算超过预算,整个服区就会卡顿,所有玩家同时感受到。主频越高,单帧能完成的计算越多,单房间能承载的人数越多。
怎么选
| 场景 | CPU 选型倾向 |
|---|---|
| 实时对战(MOBA、FPS、格斗) | 最高主频,单核性能优先,核心数够开进程即可 |
| 大型 MMO 场景服 | 高主频 + 较多核心(多场景进程并行) |
| 回合制、卡牌 | 主频要求低,核心数适中 |
| 棋牌、休闲 | 主频要求低,偏重内存和连接数 |
| 匹配、登录、社交 | 核心数优先,可横向扩展 |
| 排行榜、统计 | 核心数优先 |
经验原则:实时对战类优先选主频高的型号,别被"32 核"这种数字吸引——32 核通常是两个物理 CPU 或一堆小核,单核性能未必强。查一下具体型号的单核跑分再决定。
# 查看 CPU 型号、核心分布与当前频率
lscpu | egrep 'Model name|^CPU\(s\)|Thread|Core|Socket|MHz|NUMA'
# 观察实际运行频率(注意睿频与降频,满载可能达不到标称)
watch -n 1 'grep MHz /proc/cpuinfo | sort -u | head'
一个容易忽略的点:NUMA 与绑核
多路服务器上,跨 NUMA 节点访问内存会有额外延迟。对延迟敏感的战斗服,建议做 CPU 亲和性绑定,把关键进程固定在同一个 NUMA 节点的核心上,避免跨节点调度带来的抖动。
# 查看 NUMA 拓扑
numactl --hardware
# 将进程绑定到指定核心(示例:绑定到 0-3 核)
taskset -cp 0-3
三、内存:按在线人数估算
估算思路
内存主要被三部分占用:
- 进程自身开销:引擎、运行时、库,通常每个进程几百 MB 起
- 每玩家状态数据:角色属性、背包、位置、会话、缓冲区,这是随人数线性增长的部分
- 缓存:热存档、房间状态、地图数据
估算公式(经验):
所需内存 ≈ 进程基数 + 单进程承载人数 × 每玩家状态占用 + 缓存预留
每玩家状态占用的经验区间(仅供粗算,实际以压测为准):
| 游戏类型 | 每玩家状态占用(经验量级) |
|---|---|
| 简单休闲/棋牌 | 几十 KB 到百 KB 级 |
| 卡牌、回合制 | 百 KB 级 |
| MMO 场景服 | 数百 KB 到 1 MB 级 |
| 实时对战房间 | 数百 KB 到 MB 级(含帧缓存与快照) |
举例:一个进程承载 2000 人,每人状态 500 KB,则约 1 GB,加上进程基数和缓存预留 1 GB,单进程规划 2~3 GB 比较稳妥。一台 32 GB 的机器开 8~10 个这样的进程是合理的规划。
内存带宽与延迟
除了容量,内存带宽对高频帧循环也有影响。多通道内存配置(四通道、八通道)能提供更高带宽。此外要留足余量给系统 page cache 和网络缓冲区。
监控与预警
# 看真实占用(注意区分缓存与真实使用)
free -h
# 按进程看内存
ps aux --sort=-rss | head -20
# 看是否有 OOM 发生
dmesg -T | grep -i 'out of memory'
sudo journalctl -k | grep -i oom
规划时建议留 30% 以上余量,避免峰值时触发 OOM 或频繁换页。
四、网络延迟:不同游戏类型的敏感度
端到端 RTT 目标
"端到端"指的是客户端到服务端处理完再返回的时间,包含接入网络、骨干、机房接入和服务端处理。经验上的可接受区间:
| 游戏类型 | 可接受 RTT | 说明 |
|---|---|---|
| 回合制、卡牌、棋牌 | 100~300 ms 可接受 | 对延迟不敏感,甚至不需要实时同步 |
| 放置类、策略类 | 200~400 ms 可接受 | 异步交互为主 |
| MMO(非战斗) | 100~200 ms 可接受 | 移动同步有一定容忍度 |
| MMO 团战 | 50~150 ms 较理想 | 人数多时同步量大 |
| MOBA | 30~80 ms 较理想,超过 100 ms 明显影响手感 | 技能判定与走位敏感 |
| FPS / 射击 | 20~60 ms 较理想,超过 80 ms 体验明显下降 | 命中判定极其敏感 |
| 格斗、音游 | 20~50 ms,越低越好 | 帧级判定 |
| 云游戏 / 远程渲染 | 10~40 ms | 对延迟和抖动都极端敏感 |
抖动比平均延迟更致命
玩家感受最差的是抖动(延迟忽高忽低)和丢包,而不是稳定的高延迟。稳定 100 ms 的链路,玩家能通过预判适应;在 30 ms 和 200 ms 之间跳变的链路,手感会非常糟糕。
验收标准建议:抖动(Jitter)控制在 10 ms 以内,丢包率低于 0.5%(对射击类),并重点看晚高峰时段。
# 长样本测试,看平均延迟与抖动
mtr -rwc 1000 -n 服务器IP
# 测 UDP 端口时注意 ICMP 未必可达,用游戏实际端口的 TCP/UDP 模式复核
mtr -rwc 500 --udp -P 游戏端口 服务器IP
节点选址直接决定延迟
物理距离是硬下限,选服区位置的第一原则是玩家在哪,服区就在哪:
- 面向中国大陆玩家:境内节点(需合规部署)延迟最低
- 面向日韩玩家:日本或韩国节点
- 面向东南亚:新加坡节点
- 面向欧洲玩家:法兰克福、阿姆斯特丹等枢纽
- 面向北美:美国西海岸或东海岸(按玩家分布)
跨洲对战的延迟无法优化,因此全球同服的游戏必须按区域拆分服区,把对战匹配限制在同区域内。
五、带宽:按每玩家每秒数据量估算
估算公式
总带宽(Mbps) ≈ 在线人数 × 每玩家每秒数据量(KB/s) × 8 / 1024 × 冗余系数
每玩家每秒数据量的经验区间:
| 游戏类型 | 每玩家数据量(经验量级) | 说明 |
|---|---|---|
| 回合制、卡牌 | 1~5 KB/s | 只在操作时发包 |
| 棋牌、休闲 | 2~8 KB/s | 状态同步小 |
| MMO | 8~30 KB/s | 周围玩家越多同步量越大 |
| MOBA | 10~30 KB/s | 十人房间,状态同步频繁 |
| FPS | 20~60 KB/s | 高 tick rate 时更高 |
| 大世界/开放世界 | 30~100 KB/s | 同步实体多 |
举例:5000 人在线的 MMO,每人 20 KB/s,则 5000 × 20 × 8 / 1024 ≈ 781 Mbps,加 30% 冗余约 1000 Mbps。这个量级就需要注意带宽成本了。
降低带宽的常用手段
- 降低同步频率:非关键状态降频同步(如从 20 Hz 降到 10 Hz)
- 兴趣区域(AOI):只同步玩家视野范围内的实体
- 差分同步:只发变化量,不发全量状态
- 协议优化:二进制协议替代 JSON,字段位压缩,定点数替代浮点
- 客户端插值:用更少的同步量配合客户端预测和插值补帧
这些优化的收益往往比加带宽更持久。先优化协议和同步策略,再考虑加带宽。
带宽监控
# 实时看网卡流量
nload
iftop -i eth0
# 按连接看 UDP/TCP 流量分布
ss -unap
ss -tnp
# 历史流量统计(需安装 sysstat)
sar -n DEV 1 10
六、UDP 还是 TCP
两者的取舍
| 维度 | TCP | UDP |
|---|---|---|
| 可靠性 | 内建重传、顺序保证 | 不保证,需自己实现 |
| 队头阻塞 | 有,丢一个包会阻塞后续 | 无 |
| 延迟稳定性 | 丢包时延迟明显上升 | 可控,可丢弃过期数据 |
| 头部开销 | 较大 | 较小 |
| NAT 穿透 | 相对成熟 | 需要额外机制(STUN 等) |
| 实现复杂度 | 低 | 高,需自己做可靠层 |
| 网络中间设备兼容 | 好 | 部分网络对 UDP 有限制或限速 |
选择建议
- 实时对战(FPS、MOBA、格斗):普遍用 UDP,或在 UDP 之上实现可靠 UDP(选择性重传 + 冗余包)。原因是 TCP 丢包重传会导致队头阻塞,一个丢包就让后续数据全部延迟,对实时性伤害很大。
- 回合制、卡牌、棋牌:用 TCP 完全够,可靠性比极致延迟更重要。
- MMO:混合使用常见——关键消息(交易、聊天、道具)走可靠通道,位置和状态同步走不可靠通道。
- 登录、支付、存档:一律走可靠的 TCP/HTTP。
UDP 相关的系统参数
高并发 UDP 下,套接字缓冲区不足会导致丢包,需要调大:
# 查看当前 UDP 相关统计,关注丢包与缓冲区错误
ss -u -a -i
netstat -su | egrep 'packet receive errors|receive buffer errors'
# 调大 UDP 缓冲区示例(写入 /etc/sysctl.d/99-game.conf)
cat <<'EOF' | sudo tee /etc/sysctl.d/99-game.conf
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.core.netdev_max_backlog = 250000
net.ipv4.udp_mem = 262144 524288 1048576
EOF
sudo sysctl --system
注意:调大缓冲区会增加内存占用,需结合机器内存规划;修改内核参数前建议在测试环境验证,并保留回滚方式(直接删除该配置文件再 sysctl --system 即可恢复)。
七、抗 DDoS 是游戏服的刚需
游戏是 DDoS 攻击的高发行业:竞技对抗容易引发恶意攻击,开服活动期被打更是常态。选型时必须考虑防护能力。
防护的三个层次
| 层次 | 能力 | 说明 |
|---|---|---|
| 机房/云侧清洗 | 大流量清洗,TB 级能力 | 靠高防 IP 或高防机房,是第一道防线 |
| 接入层限流 | 限制单 IP 连接数与包速率 | 网关服层面实现,防连接耗尽 |
| 应用层防护 | 协议校验、频率限制、行为风控 | 防协议层滥用和逻辑漏洞 |
选型要点
- 防护带宽峰值:了解清洗能力和触发清洗的阈值,以服务商官网说明为准
- 清洗对延迟的影响:部分清洗方案会引入额外跳数和延迟,对延迟敏感的游戏要实测
- UDP 防护能力:游戏多走 UDP,要确认防护方案对 UDP 的有效性
- 隐藏源站:用高防 IP 或代理转发时,源站 IP 不能暴露,否则防护被绕过
- 应急响应:了解攻击发生时的响应流程和联系渠道
网关层的自我保护
# 限制单 IP 并发连接数示例(nftables,需按实际环境调整)
# 风险提示:改防火墙规则前先确认当前连接方式,避免把自己挡在门外;
# 建议在控制台/带外管理通道可用时操作,并保留回滚(nft list ruleset > backup.nft)
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; }
sudo nft add rule inet filter input ip protocol udp ct state new \
meter game_limit { ip saddr limit rate over 100/second } drop
更常见的做法是在网关服务程序里做连接数和包速率限制,比内核层更容易按业务规则调整。
八、部署形态:物理机、云、K8s 怎么选
| 形态 | 优点 | 缺点 | 适合 |
|---|---|---|---|
| 物理机(独服) | 性能稳定、无虚拟化开销、单核性能可挑型号、长期成本低 | 交付慢、扩容不灵活、硬件故障需换机 | 稳定规模的战斗服、数据库服、长期开服 |
| 云服务器 | 分钟级交付、弹性扩缩、快照备份方便 | 有虚拟化开销、性能受宿主机影响、长期成本高 | 开服初期、活动扩容、网关和无状态层 |
| 容器 / K8s | 部署标准化、编排能力强、资源利用率高 | 网络性能需调优、有状态服务编排复杂 | 网关、匹配、微服务;战斗服需谨慎评估 |
务实建议
- 混合使用:固定基线部分用物理机或预留实例,波峰部分用云弹性扩容
- 战斗服倾向物理机或独占型云主机:因为它对 CPU 单核性能和延迟抖动最敏感,虚拟化带来的抖动会被玩家感知
- 网关和无状态层用云或容器:容易扩缩容,故障影响小
- 数据库用物理机或托管 RDS:IO 稳定性和数据安全优先
关于容器的网络性能
容器网络方案(Overlay、CNI 插件)会引入额外转发开销。对延迟敏感的服区,可以考虑host 网络模式或 SR-IOV 类方案,并在压测中对比容器内外延迟差异。
九、压测与扩容
压测要测什么
| 维度 | 指标 | 目标 |
|---|---|---|
| 容量 | 单进程承载人数、单台承载人数 | 找到拐点 |
| 延迟 | RTT、抖动、帧同步延迟 | 抖动控制在 10 ms 内 |
| CPU | 单帧耗时、帧率稳定性 | 单帧耗时低于帧预算 |
| 内存 | 峰值占用、增长趋势 | 留 30% 余量 |
| 带宽 | 每玩家实测数据量 | 与估算对比 |
| 稳定性 | 长时间运行的内存增长、句柄泄漏 | 无泄漏 |
压测方法
最简单有效的是用机器人(bot)模拟真实客户端行为,而不是只发空包。要点:
- 行为要真实:移动、技能、聊天都按比例模拟,纯心跳压测结果严重偏乐观
- 逐步加压:从低并发逐步加,观察拐点出现在哪里
- 长稳测试:跑数小时甚至一天,看内存和句柄是否持续增长
- 弱网模拟:用网络模拟工具注入延迟、抖动、丢包,验证客户端表现
# 用 tc/netem 模拟弱网(示例:给 eth0 加 50ms 延迟、10ms 抖动、1% 丢包)
# 风险提示:tc 规则会影响该网卡上的所有流量,操作前确认影响范围;
# 删除规则:sudo tc qdisc del dev eth0 root
sudo tc qdisc add dev eth0 root netem delay 50ms 10ms loss 1%
sudo tc qdisc show dev eth0
扩容的正确顺序
- 先看瓶颈在哪:是 CPU 单帧跑不动、内存不够、还是带宽或连接数到顶
- 单进程优化:优化同步协议、降频、AOI,单进程承载提升最省钱
- 加进程分片:一台机器开更多进程,分摊到不同核
- 加机器分服:按场景或房间分片到多台机器
- 最后才加带宽:确认是带宽瓶颈再加
不要一上来就加机器。 很多时候协议优化能让单进程承载翻倍,这比加机器的成本低得多。
十、配置推荐参考
以下为经验起点,务必以压测结果为准调整:
| 规模 | 服区类型 | CPU | 内存 | 网络 | 存储 |
|---|---|---|---|---|---|
| 小规模(数百人在线) | 单节点合并部署 | 4 核高主频 | 8~16 GB | 30~100 Mbps | SSD 200 GB |
| 中等(数千人在线) | 网关 / 逻辑 / 数据库分离 | 逻辑服 8 核高主频 | 32 GB 起 | 100~500 Mbps | NVMe |
| 较大(上万人在线) | 多进程分片 + 多机 | 战斗服高主频机型多进程 | 64 GB 起 | 500 Mbps~1 Gbps | NVMe + 独立数据库 |
| 大型 / 多服区 | 全拆分 + 跨可用区 | 按服区横向扩展 | 按分片规划 | 按估算公式 | 托管数据库或高 IO 独服 |
规划时的三个硬约束:CPU 单核性能决定单房间承载,内存决定单进程人数,带宽决定总在线规模。
常见误区
"核心数越多越好。" 不一定。实时对战的逻辑帧循环是单线程的,加核心不能提升单房间承载,只有能开更多进程时才有用。优先看单核性能和主频。
"带宽按峰值在线人数算就够了。" 不够。还要考虑广播同步带来的放大(一个玩家的动作可能要同步给周围几十人),以及开服、活动时的瞬时峰值。留 30% 以上冗余。
"TCP 更可靠,用 TCP 就行。" 对实时对战不对。TCP 丢包重传会造成队头阻塞,一个丢包就卡顿。FPS、MOBA 这类应走 UDP 并在应用层做可靠层。
"云服务器和物理机性能一样。" 有差异。虚拟化会引入调度抖动,对延迟敏感的游戏可能可感知。战斗服这类关键进程建议用物理机或独占型实例。
"压测跑通就不用管了。" 要做长稳测试和弱网测试。内存泄漏和弱网下的表现,短时压测发现不了。
常见问题
游戏服 CPU 应该看主频还是核心数?
实时对战类优先看单核性能和主频,因为逻辑帧循环是单线程的;核心数的价值在于能开更多进程承载更多房间。回合制、卡牌类对主频要求低,可以看核心数。
一台机器能承载多少玩家?
取决于单进程承载和进程数。先用压测找出单进程承载人数的拐点(比如 2000 人),再按内存和 CPU 核数决定开几个进程。粗算时按"每玩家状态占用 × 人数 + 缓存预留"估内存。
为什么玩家说卡,但服务器 CPU 和内存都很低?
大概率是网络问题:延迟抖动、丢包、或者跨境链路晚高峰劣化。用 mtr 长样本测玩家所在网络到服区的链路,重点看抖动和丢包,而不是平均值。也可能是单帧耗时超标(CPU 总量低但单线程打满)。
UDP 老是丢包怎么排查?
先看系统层面:netstat -su 查 receive buffer errors,如果持续增长说明套接字缓冲区不够,调大 rmem/wmem;再看网关限流规则是否过严;最后看链路本身的丢包(用长样本 mtr 从玩家侧测)。
开服活动前怎么准备?
提前做压测确定容量上限、准备扩容脚本和机器资源、设置监控告警(在线人数、帧耗时、带宽、丢包)、确认高防方案和应急响应联系方式、准备限流和排队机制防止瞬间冲垮。活动期间实时监控,宁可排队也不要让服区崩溃。
多区域服区怎么部署?
按玩家分布划分服区,同区域内匹配对战,跨区域只做社交和数据同步。数据库按区域分库,全局数据(账号、排行榜)单独处理。注意不同区域的数据合规要求,面向欧洲玩家要关注 GDPR,面向中国大陆玩家要遵守中国法律法规。
总结
- 游戏服架构按职责拆分:网关服(连接与转发,易扩展)、逻辑/场景服(房间与业务,高主频 CPU)、战斗服(实时计算,最看重单核性能和低抖动)、数据库服(持久化,内存 + NVMe)。瓶颈最常出现在战斗服(单核主频)和数据库服(IO 与锁)。
- CPU 优先看主频和单核性能:逻辑帧循环是单线程的,30 Hz 每帧只有约 33 ms 预算、60 Hz 只有约 16 ms,单帧超时全服玩家一起卡。实时对战不要被"多核"数字吸引,先查具体型号的单核跑分。
- 内存按"进程基数 + 人数 × 每玩家状态占用 + 缓存预留"估算,每玩家状态从棋牌的几十 KB 到开放世界的上百 KB 不等;规划留 30% 以上余量,并做长稳测试查泄漏。
- 延迟敏感度按类型分级:回合制/卡牌 100~300 ms 可接受,MMO 100~200 ms,MOBA 30~80 ms,FPS 20~60 ms,格斗和云游戏更低。抖动比平均延迟更致命,验收看抖动小于 10 ms、丢包低于 0.5%,并重点看晚高峰。
- 带宽按"在线人数 × 每玩家每秒 KB 数 × 8 / 1024 × 冗余"估算,先通过 AOI、差分同步、降频、二进制协议把每玩家数据量降下来,再考虑加带宽。
- 协议选择:实时对战走 UDP 或可靠 UDP(TCP 队头阻塞在丢包时伤害很大),回合制/棋牌走 TCP,登录支付存档一律走可靠通道;高并发 UDP 要调大套接字缓冲区并监控 receive buffer errors。
- 抗 DDoS 是刚需,三层防护(机房清洗、网关限流、应用层校验)缺一不可,注意隐藏源站 IP 并确认 UDP 防护有效性。部署形态上战斗服倾向物理机或独占实例,网关和无状态层用云或容器,数据库用物理机或托管 RDS。
- 压测要用真实行为的机器人、逐步加压找拐点、做长稳和弱网(tc/netem)测试;扩容顺序是先协议优化 → 加进程分片 → 加机器分服 → 最后加带宽。
企业QQ咨询




