如何选择适合游戏服务器的VPS?
游戏服务器VPS应优先考虑高单核性能和足够RAM,而非核心数量。本文说明配置估算、端口、systemd自动重启、备份,以及服务器位置如何决定延迟。
您指的是哪一类游戏 VPS?
用于游戏服务器的 VPS 适合完成一种任务:运行专用服务器,让您和朋友从各自的设备连接到该服务器。对于另一种常见需求,它就不适合了:通过远程桌面直接在 VPS 上运行游戏。这两种任务需要的硬件正好相反。专用服务器需要一个高性能 CPU 核心,以及足够容纳游戏世界数据的 RAM。运行游戏则需要 GPU(图形处理器),而标准 VPS 套餐通常不提供 GPU。
以下内容都针对第一种任务。第二种需求也值得您花两分钟确认,因为很多人会因此买错服务器。
为什么不能在 VPS 上玩游戏
标准 VPS 提供的是虚拟 CPU 核心,不提供显卡。物理主机不会向 VPS 直通任何硬件,因此没有可供游戏使用的硬件渲染器。可以查看实际获得的设备:
sudo apt install -y pciutils
lspci | grep -iE "vga|3d"答案是虚拟显示适配器,例如 Cirrus Logic 或 virtio GPU 设备。它的作用是让服务商的 Web 控制台显示屏幕,背后没有 3D 加速。安装桌面环境和 VNC 服务器后,glxinfo -B 会将渲染器报告为 llvmpipe,也就是 Mesa 的软件渲染器,由 CPU 执行。现代 3D 游戏如果由 CPU 渲染,每秒只能运行几帧,因此在任何数据离开这台主机之前,游戏就已经无法正常运行。Windows 实例也会遇到同样的问题,只是表现不同。许多游戏启动时会报错,提示无法创建 Direct3D 设备,因为没有显示适配器可供创建该设备。
第二个问题是画面返回到客户端的过程。在远程主机上玩游戏时,每一帧都要编码为视频,通过互联网发送,再在您的屏幕上解码。这会在游戏本身的输入延迟之外增加编码和解码延迟,而且 RDP 和 VNC 面向的是桌面操作,不是每秒 60 帧的动态画面。云游戏服务使用真实的 GPU 硬件和专用的流式传输协议解决了这些问题。普通 VPS 两者都没有。如果您想玩游戏,请租用 GPU 资源。如果您想托管游戏服务,请继续阅读。
专用游戏服务器实际需要什么
游戏服务器本质上是一个模拟循环。它将游戏世界保存在内存中,并以固定频率推进状态。然后,服务器会向每个已连接的玩家发送其可见范围内的世界数据。
这种工作方式决定了硬件需求。循环主要运行在一个线程上,因此单核性能比核心数量更重要。游戏世界驻留在内存中,因此 RAM 通常是最先达到的限制。游戏运行期间磁盘负载较低,加载和保存时负载较高。网络路径决定 ping 值,升级套餐也不会改变这一点。
单核性能优先于核心数量
大多数游戏服务器在一个主线程上推进游戏世界。Minecraft 的 tick 循环和 Source 引擎的服务器帧处理都是如此。每个 tick 都有明确的截止时间。Minecraft Java 每秒运行 20 个 tick,因此每个 tick 只有 50 毫秒的处理时间。如果任务无法在规定时间内完成,服务器会准确输出以下内容:
[12:04:51] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 2547ms or 50 ticks behind这表示一个线程耗尽了可用时间。增加核心数不会为该线程提供更多时间。一个包含 2 个高速 vCPU 的方案可以保持稳定的 tick 速率,而包含 8 个低速 vCPU 的方案可能出现 tick 速率下降,因为这 8 个核心中只有 1 个在执行关键任务。
在确定方案前,先测量单线程性能:
sudo apt install -y sysbench
sysbench cpu --cpu-max-prime=20000 --threads=1 run查看 events per second 行。这个数值单独看没有意义,只有用于比较时才有意义。因此,请在两个候选方案上分别运行测试,并将结果并列比较。完整的 VPS 基准测试会以相同方式覆盖磁盘和网络性能。
额外核心仍然有价值。它们可以运行第二个游戏服务器、数据库、夜间备份和区块预生成器,而不会抢占 tick 线程的处理时间。服务器软件也逐渐支持并行处理。Paper 是一个常用的 Minecraft 服务器分支,它会将部分任务移出主 tick 线程。因此,应选择少量高速核心,而不是大量低速核心。
方案页面上不会显示一个数值,但它决定了您付费购买的高速核心是否真正可用:
vmstat 1 5st 列表示您的虚拟 CPU 已准备运行、但物理主机将该核心分配给其他租户的时间百分比。st 持续高于几个百分点,通常表示物理主机超售。此时,即使 top 仍显示您的服务器存在空闲 CPU,玩家也会感受到卡顿,因为这段空闲时间并不由您支配。
游戏服务器需要多少 RAM?
The data behind this chart
[
{
"label": "Minecraft Java, vanilla",
"players": 10,
"ram_gb": 2
},
{
"label": "Minecraft Java, large modpack",
"players": 10,
"ram_gb": 8
},
{
"label": "Valheim",
"players": 10,
"ram_gb": 4
},
{
"label": "Palworld",
"players": 32,
"ram_gb": 16
}
]以下是游戏和模组包文档截至 August 2026 发布的初始分配值。这些数值用于指导,并非在某一台服务器上实测得出。原版 Minecraft Java 为约 10 名玩家分配 2 GB 堆内存即可稳定运行。同样的玩家数量使用大型模组包时需要 8 GB,因为模组会增加实体和生成结构,而这些内容都驻留在该堆内存中。Valheim 自身列出的最低值为 2 GB,但运行小型世界的管理员报告称,进程通常会稳定在接近 3 GB 的用量,因此从 4 GB 开始比较合理。Palworld 是例外:其最多支持 32 名玩家,Pocketpair 建议分配 16 GB。
RAM 不会随连接数线性增长,而是随已加载的世界内容增长。每名玩家都会使其周围的区域保持加载,因此两名玩家站在一起所需的内存,远低于两名玩家分别探索地图相对两端时的用量。这就是为什么“每名玩家需要多少 RAM”只能作为粗略参考,而“每个活动区域需要多少 RAM”才是真正的决定因素。也因此,一个喜欢探索的小团队可能会超出按其两倍人数规划的方案。
Java 服务器还需要遵循两条规则。将堆内存的最小值和最大值设为相同数值,使 JVM 无需暂停来调整堆大小:
java -Xms4G -Xmx4G -jar server.jar nogui然后保留余量。JVM 还会使用堆之外的内存,用于线程栈和本机缓冲区;内核也需要 page cache,以便快速读取世界文件。在 6 GB 的服务器上,将堆设置为 4 GB 是合理的,而设置为 6 GB 则不合理。
两种内存故障的表现完全不同,因此要记住这两类错误信息。堆过小时,错误会在 Java 内部抛出,服务器通常仍会勉强运行:
java.lang.OutOfMemoryError: Java heap space堆大于服务器的可用内存时,整个进程会被外部终止。控制台只会显示 Killed,具体证据位于内核日志中:
sudo dmesg -T | grep -i "out of memory"增加 swap 只能避免进程被终止,不能解决根本问题。tick 循环如果必须从 swap 中重新读取世界数据,就会错过每个截止时间。因此,玩家看到的不是崩溃的服务器,而是冻结的服务器。
版本说明,截至 August 2026 仍然有效:Minecraft Java 1.20.5 及更高版本要求 Java 21。较旧的运行时会先启动,然后因 unsupported class file version error 失败。该错误看起来像编译器消息,第一次遇到时很容易让人困惑。
sudo apt install -y openjdk-21-jre-headless
java -version磁盘速度对游戏服务器重要吗?
在游戏运行期间,磁盘速度的影响低于许多人预期,但在两个特定时刻影响很大。服务器启动时会将世界读入内存,自动保存时会将数据写回磁盘。因此,磁盘速度会影响启动速度,也会影响执行保存时的暂停时间。在这两者之间,大多数读取请求都由 RAM 提供。
有两点会让磁盘的重要性高于上述概括。玩家移动时,探索过程会从磁盘加载新的区块或区域,而读取操作会占用 tick 时间预算。大型世界执行自动保存时会一次写入大量数据;如果卷速度较慢,写入会阻塞循环足够长的时间,从而打印上文所述的 “Can't keep up” 警告。这两者都是延迟问题,而不是吞吐量问题。因此,VPS 上 NVMe 与 SATA SSD 之间的差距比标称的每秒兆字节数更值得关注。真正需要关注的是单次小型操作需要多长时间。
请按增长需求规划卷容量。每当有人探索新的地点时,世界都会增长,而备份会将其占用的空间成倍增加。每周运行一次 du -sh world,持续一个月后,您就能了解实际增长率。
Tick rate、ping 以及两者的区别
Tick rate 表示服务器每秒重新计算游戏世界的次数。Minecraft Java 的 tick rate 为 20。Source engine 服务器通常为 64。Minecraft 无法通过购买硬件提高这个数值,因为 tick rate 属于游戏设计的一部分。因此,目标是稳定保持 20,而不是超过它。
Ping 是单个玩家与服务器之间的往返延迟。这两种情况会产生不同的问题,因此在花钱升级前应先区分它们。服务器未能按时完成 tick 时,所有玩家会在同一时刻出现回弹,服务器日志也会明确记录这一点。某个玩家的网络路径较长时,只有该玩家会出现延迟,其他玩家仍然正常。更强的 CPU 无法解决第二种情况。
延迟取决于地理位置,而不是套餐级别
光在光纤中的传播速度约为每毫秒 200 千米。往返需要经过两次这段距离,因此玩家与服务器之间每相隔 100 千米,理论下限约为 1 ms。没有任何服务商能突破这一限制,升级套餐也无法改变它。
The data behind this chart
[
{
"label": "Toronto to New York",
"distance_km": 550,
"rtt_floor_ms": 5.5
},
{
"label": "Dallas to Chicago",
"distance_km": 1290,
"rtt_floor_ms": 12.9
},
{
"label": "Dallas to Los Angeles",
"distance_km": 1990,
"rtt_floor_ms": 19.9
},
{
"label": "New York to London",
"distance_km": 5570,
"rtt_floor_ms": 55.7
},
{
"label": "Los Angeles to Sydney",
"distance_km": 12070,
"rtt_floor_ms": 120.7
}
]这些下限根据大圆距离计算得出。实际光纤不会沿直线铺设,路径上的每台路由器也会增加少量延迟,因此良好的实际结果通常接近理论下限的两倍。多伦多玩家连接到纽约服务器时,两地相距 550 千米,理论下限为 5.5 ms,通常会看到十几毫秒的延迟。洛杉矶到悉尼的路径理论下限为 120.7 ms,再多投入资金也无法缩短它。
因此,应将服务器部署在玩家附近。如果玩家群体分布在大洋两岸,就必然有人需要经过较长路径。通常,合理的选择是将服务器部署在玩家数量最多的区域。
不要凭猜测判断路径,应直接测量:
sudo apt install -y mtr-tiny
mtr -rwzc 100 203.0.113.10先查看最后一行。该行显示服务器,只有服务器的丢包和延迟会决定游戏体验。中间某一跳显示丢包,但最后一跳正常时,几乎总是因为该路由器启用了 ICMP 速率限制。路由器会降低探测数据包回复的优先级,但仍会正常转发实际流量。应让每名玩家都对服务器运行一次测试,因为每个人经过的路径都不同。
往返延迟下限的计算方法
光在玻璃中的传播速度约为真空光速的三分之二,换算后接近每毫秒 200 km。往返需要经过两次这段距离,因此以毫秒计的理论下限为单程距离(千米)除以 100。纽约到伦敦的距离为 5,570 km,5570 除以 100 得到 55.7 ms。所有实测数值都会高于这一结果,因为线缆会沿海岸线铺设,路由器也需要时间处理数据包。
仅开放游戏所需的端口
游戏服务器通常只需要开放一个或两个端口,不应开放其他端口。常见默认值如下:
- Minecraft Java Edition:TCP 25565
- Minecraft Bedrock Edition:UDP 19132
- Valheim:UDP 2456 和 UDP 2457
- Palworld:UDP 8211
- 使用 Source 引擎的游戏,例如 Counter-Strike 2:UDP 27015
请查阅游戏自身的文档,因为有些游戏还会使用额外的查询端口。Valheim 是最典型的例子:2456 承载游戏流量,2457 响应 Steam 服务器查询,使服务器显示在浏览器列表中。因为 Valheim 只使用 UDP,所以在 TCP 上开放这些端口没有任何作用。
启用防火墙前,先允许 SSH,否则会被自己的服务器锁在外面:
sudo ufw allow 22/tcp
sudo ufw allow 25565/tcp
sudo ufw enable
sudo ufw status verbose许多服务商还会在控制面板中提供独立于服务器本机防火墙的网络防火墙。在 ufw 中开放但在该网络防火墙中关闭的端口仍会拒绝连接。从外部看,两种情况的现象完全相同,因此开始修改配置文件前,请检查这两个位置。
从另一台机器检查 TCP 端口很简单:
sudo apt install -y netcat-openbsd
nc -vz 203.0.113.10 25565UDP 不能通过这种方式测试。关闭的 UDP 端口通常不会响应,因此探测没有收到回复并不能说明任何问题。请改为从服务器端确认,并查找绑定到预期端口的游戏进程:
sudo ss -lunp | grep 2456切勿将 RCON(远程控制台协议)暴露到互联网。默认情况下,它会在 25575 端口上通过明文连接发送单个密码。将其绑定到 127.0.0.1,然后通过 SSH 隧道访问。还应使用独立的非特权用户运行游戏服务器,这样 mod 中的漏洞就无法访问机器的其他部分。新 VPS 上的前 10 分钟介绍了本节假定你已经完成的用户账户配置和 SSH 加固。
让服务器由 systemd 管理并自动重启
在 SSH 会话中手动启动的服务器会在会话关闭时终止,重启后也不会自动恢复。systemd 可以同时解决这两个问题。创建 /etc/systemd/system/minecraft.service:
[Unit]
Description=Minecraft Java server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms4G -Xmx4G -jar server.jar nogui
Restart=on-failure
RestartSec=15
TimeoutStopSec=180
[Install]
WantedBy=multi-user.targetRestart=on-failure 会在服务器崩溃后将其重新启动,并在正常关闭后保持停止状态,这正是所需的行为。Restart=always 会在您每次有意停止服务器时将其重新启动。TimeoutStopSec=180 的作用比看起来更重要。systemctl stop 会发送 SIGTERM,原版 Minecraft 服务器会捕获该信号,在退出前保存世界;超时后,systemd 会改为发送 SIGKILL。大型世界的写入时间可能超过默认的 90 秒,SIGKILL 发出时尚未写入磁盘的数据都会丢失。
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
sudo journalctl -u minecraft -f正常启动会以类似 Done (12.345s)! For help, type "help" 的日志行结束。如果单元在 activating 和 failed 之间反复切换,journalctl -u minecraft -n 50 会记录原因。通常是 WorkingDirectory 中的路径错误,或分配的堆内存大于主机可用内存。
systemd 不提供交互式控制台,因此应提前规划。可以在 localhost 上使用 RCON 执行命令,或者在 tmux 会话中运行服务器。与此相同的做法还可以让在 VPS 上长时间运行的 Claude Code 会话在登录之间保持运行。
通过 Steam 分发的游戏需要先安装 SteamCMD。Ubuntu 软件包是 32 位二进制文件,因此需要添加架构配置。跳过该行后,apt 会报告没有可用的安装候选项:
sudo add-apt-repository multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y steamcmd某些游戏服务器运行时间越长,内存占用越高。与其修复根因,通常的处理方式是在低峰时段定期重启。使用 systemd timer 调用 systemctl restart 比使用 cron 条目更容易排查,因为 systemctl list-timers 会准确显示下一次触发的时间。
按计划备份整个世界
游戏服务器上的所有内容都可以替换,只有世界目录和玩家数据例外。重新安装游戏只需几分钟。重建群组数月来建造的内容则需要数月。
安全的备份应在没有进程写入时进行。将服务器停止一分钟,是确保这一点的最简单方法:
sudo systemctl stop minecraft
sudo tar czf /var/backups/mc-$(date +%F).tgz -C /opt/minecraft world world_nether world_the_end
sudo systemctl start minecraft如果无法接受每晚暂停服务器,也可以先刷新世界数据。在 Minecraft 控制台中,save-off会停止自动保存,save-all flush会写入所有仍处于待处理状态的数据,复制完成后,save-on会重新启用自动保存。服务器正在写入时复制世界,可能会得到只写入了一半的区域文件。直到需要恢复时,您才会发现该文件已损坏。
至少保留一份服务器之外的副本。同一磁盘上的备份无法应对磁盘故障。云服务商的快照只是便利功能,不是真正的备份,因为它位于您可能失去的同一账户中。将 restic 备份定期发送到异地存储可以处理保留策略和重复数据删除,因此连续一个月保存每晚的世界副本也不会占满您的卷。
然后实际恢复一次。您从未恢复过的备份只是一个假设。将昨晚的归档解压到备用目录,让测试服务器使用该目录,并确认世界可以加载,建筑物也保持原样。
在决定之前先进行测试
不要直接购买一年,先购买一个月,并让真实玩家测试一个晚上。运行单线程 sysbench 基准测试,然后让每位玩家运行 mtr,连接到服务器。完整的 VPS 基准测试流程会详细介绍这些工具,并展示糟糕的结果是什么样;VPS 每月的实际成本则有助于确认您付费购买的是限制服务器性能的资源,而不是套餐页面上标注数值最大的资源。
另外两篇文章会继续介绍本文未展开的内容。在 VPS 上搭建 Minecraft 服务器以大多数人最先接触的游戏为例,逐步说明上述全部操作。VPS 可以运行的更多服务适合希望服务器在游戏之夜之外也能发挥实际用途的读者。
FAQ
我可以在 VPS 上玩游戏,而不是购买游戏电脑吗?
不可以。标准 VPS 没有 GPU,只有供服务商控制台使用的虚拟显示适配器。因此,安装桌面后,glxinfo -B 会报告软件渲染器 llvmpipe,3D 游戏只能以每秒几帧的速度运行。即使挂载了 GPU,远程游玩时每一帧的往返过程还会增加视频编码和解码开销,而 RDP 和 VNC 从未针对这种用途设计。VPS 适合托管供群组连接的专用服务器。如果您希望游玩游戏,请租用 GPU 资源或使用云游戏服务。
游戏服务器需要多少个 CPU 核心?
对于大多数游戏,2 个高频核心优于 8 个低频核心,因为世界模拟在一个主线程上运行,额外核心无法帮助该线程在 50 ms 的期限内完成任务。使用 sysbench cpu --cpu-max-prime=20000 --threads=1 run 比较候选方案,并查看每秒事件数。若您还要在同一台服务器上运行第二个服务器或数据库,额外核心值得购买,因为这些工作负载可以并行运行,不会占用 tick 线程的时间。
Minecraft 服务器需要多少 RAM?
对于约有 10 名玩家的原版世界,堆内存需要约 2 GB;在玩家数量相同的情况下,大型模组包需要 8 GB。将 -Xms 和 -Xmx 设为相同值,并为操作系统预留 1 GB 到 2 GB 的空闲内存,因为 JVM 会使用堆外内存,内核也需要页缓存。如果堆内存大于服务器实际内存,内核会终止该进程。此情况会在 dmesg 中显示为内存不足日志,而不是 Java 错误。
为什么服务器还有空闲 CPU 和 RAM,但玩家仍然卡顿?
有两种原因符合这种情况。检查服务器日志中的 Can't keep up! Is the server overloaded?。这表示单个主线程未能在 50 ms 的 tick 预算内完成任务,而其他核心处于空闲状态。如果没有这行日志,问题就出在网络路径上。让每名玩家针对您的服务器地址运行 mtr -rwzc 100 203.0.113.10,并查看最后一行。还要检查 vmstat 1 中的 st 列:steal time 超过几个百分点,表示宿主机超售,因此您看到的空闲 CPU 实际上并未分配给您。
游戏服务器需要开放哪些端口?
只需开放游戏使用的端口和 SSH 端口。Minecraft Java 使用 TCP 25565,Minecraft Bedrock 使用 UDP 19132,Valheim 使用 UDP 2456 和 2457,Palworld 使用 UDP 8211。在运行 ufw enable 之前添加 SSH 规则,否则您会失去对服务器的访问权限。请注意,许多服务商还会在控制面板中运行第二层防火墙,因此必须在两处都开放端口。不要将 RCON 的 25575 端口开放到互联网,因为它只使用明文发送的一个密码。