如何选择适合游戏服务器的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?
此图表背后的数据
[
{
"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,游戏和模组包文档公布的起始内存分配。这些数值仅供参考,并非在某一台服务器上实测得出。对于约 10 名玩家,原版 Minecraft Java 使用 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 还会在堆内存之外使用内存,例如线程栈和本机缓冲区;内核也需要页面缓存,以便快速读取世界文件。在一台 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 中重新读取世界数据,就会错过每个截止时间。这样玩家看到的不是已崩溃的服务器,而是完全卡住的服务器。
补充一个版本信息。经于 2026-10-11 对照 Mojang 的版本元数据确认:Minecraft Java 1.20.5 到 1.21.11 需要 Java 21;26.1 及更高版本(包括当前的 26.3)需要 Java 25。较旧的运行时可以启动,但随后会因 unsupported class file version 错误而失败。这个错误看起来像编译器消息,第一次遇到时很容易让人困惑。Ubuntu 22.04、24.04 和 26.04 的标准软件仓库都提供 Java 25 运行时:
sudo apt install -y openjdk-25-jre-headless
java -version磁盘速度对游戏服务器重要吗?
在游戏运行期间,磁盘速度的影响低于许多人预期,但在两个特定时刻影响很大。服务器启动时会将世界读入内存,自动保存时会将数据写回磁盘。因此,磁盘速度会影响启动速度,也会影响执行保存时的暂停时间。在这两者之间,大多数读取请求都由 RAM 提供。
有两点会让磁盘的重要性高于上述概括。玩家移动时,探索过程会从磁盘加载新的区块或区域,而读取操作会占用 tick 时间预算。大型世界执行自动保存时会一次写入大量数据;如果卷速度较慢,写入会阻塞循环足够长的时间,从而打印上文所述的 “Can't keep up” 警告。这两者都是延迟问题,而不是吞吐量问题。因此,VPS 上 NVMe 与 SATA SSD 之间的差距比标称的每秒兆字节数更值得关注。真正需要关注的是单次小型操作需要多长时间。
请按增长需求规划卷容量。每当有人探索新的地点时,世界都会增长,而备份会将其占用的空间成倍增加。每周运行一次 du -sh world,持续一个月后,您就能了解实际增长率。
Tick 频率、ping 以及二者的区别
Tick 频率是服务器每秒重新计算游戏世界的次数。Minecraft Java 的运行频率为 20。Source engine 服务器通常以 64 运行。在 Minecraft 中,20 是游戏设计所采用的频率。/tick rate 命令可以修改该值,但这会加快或减慢整个世界的运行速度,而不会让运行更流畅;升级服务器配置也不会自动提高该值。因此,目标是稳定保持 20,而不是超过 20。
Ping 是一名玩家与服务器之间的往返时间。这两种情况会导致不同的问题,因此在花钱升级前应先区分它们。服务器未能按时完成 tick 时,所有玩家通常会在同一时刻发生回弹,服务器日志也通常会明确记录该问题。某名玩家的网络路径较长时,只有该玩家会出现延迟,其他玩家不受影响。升级 CPU 无法解决后一种情况。
延迟取决于地理位置,而不是套餐级别
光在光纤中的传播速度约为每毫秒 200 千米。往返需要经过两次这段距离,因此玩家与服务器之间每相隔 100 千米,理论下限约为 1 ms。没有任何服务商能突破这一限制,升级套餐也无法改变它。
此图表背后的数据
[
{
"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
- Valve 的 Source 和 Source 2 游戏,例如 Counter-Strike 2:UDP 27015
请查阅游戏自身的文档,因为有些游戏还会使用额外的查询端口。Valheim 是最明显的例子:2456 传输游戏流量,2457 响应 Steam 服务器查询,使服务器显示在浏览器列表中。在 TCP 上开放这些端口没有作用,因为 Valheim 只使用 UDP。
启用防火墙前,请先允许 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 25565无法用同样的方法测试 UDP。关闭的 UDP 端口通常不会响应,因此探测没有得到回复并不能说明任何问题。请改为从服务器端确认,并查找绑定到预期端口的游戏进程:
sudo ss -lunp | grep 2456绝不要将 RCON(远程控制台协议)暴露到互联网。默认情况下,它会在 25575 端口上通过明文连接发送单个密码。请将其绑定到 127.0.0.1,并通过 SSH 隧道访问。还应使用独立的非特权用户运行游戏服务器,这样 mod 中的漏洞就无法访问机器的其他部分。新 VPS 上的前十分钟介绍了本节默认你已经完成的用户账户配置和 SSH 加固。
让服务器由 systemd 管理并自动重启
在 SSH 会话中手动启动的服务器会在会话关闭时退出,重启后也不会自动恢复。systemd 可以解决这两个问题。该单元以专用的 minecraft 用户运行服务器。该用户只拥有 /opt/minecraft:
sudo useradd --system --home-dir /opt/minecraft --shell /usr/sbin/nologin minecraft
sudo chown -R minecraft:minecraft /opt/minecraft然后创建 /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 上玩游戏,而不是购买游戏 PC 吗?
不可以。标准 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 预算内完成任务,而其他核心处于空闲状态。在 Paper 中,可以通过 warn-on-overload: false 在 bukkit.yml 中关闭此警告,因此在确认它仍处于启用状态前,不要根据警告缺失来判断问题不存在。如果警告已启用但没有出现,请检查网络路径:让每名玩家针对您的服务器地址运行 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 端口开放到互联网,因为它只使用一个以明文发送的密码。