强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Minecraft PaperMC 服务器部署指南 / 07 - 性能调优

07 - 性能调优

7.1 性能监控基础

在调优之前,先了解服务器的性能指标。

7.1.1 核心指标

指标 含义 健康值 警告值
TPS 每秒游戏刻(Ticks Per Second) 20.0 < 18.0
MSPT 每 Tick 毫秒数(Milliseconds Per Tick) < 30ms > 50ms
内存使用 Java 堆内存占用 < 75% > 85%
CPU 使用 服务端 CPU 占用 < 60% > 80%
区块加载 每秒加载的区块数 平稳 持续高峰
实体数量 世界中的实体总数 < 5000 > 10000

7.1.2 快速诊断命令

# PaperMC 内置 TPS 显示
/tps

# 查看内存使用
/memory

# Paper 的调试信息
/paper mobcaps            # 查看怪物上限
/paper entity list        # 查看实体统计
/paper chunk info <x> <z> # 查看区块信息

7.2 JVM 参数优化

7.2.1 Aikar’s Flags(推荐配置)

这是社区公认的 Minecraft 最优 JVM 参数:

java \
  -Xms4G -Xmx4G \
  -XX:+UseG1GC \
  -XX:+ParallelRefProcEnabled \
  -XX:MaxGCPauseMillis=200 \
  -XX:+UnlockExperimentalVMOptions \
  -XX:+DisableExplicitGC \
  -XX:+AlwaysPreTouch \
  -XX:G1NewSizePercent=30 \
  -XX:G1MaxNewSizePercent=40 \
  -XX:G1HeapRegionSize=8M \
  -XX:G1ReservePercent=20 \
  -XX:G1HeapWastePercent=5 \
  -XX:G1MixedGCCountTarget=4 \
  -XX:InitiatingHeapOccupancyPercent=15 \
  -XX:G1MixedGCLiveThresholdPercent=90 \
  -XX:G1RSetUpdatingPauseTimePercent=5 \
  -XX:SurvivorRatio=32 \
  -XX:+PerfDisableSharedMem \
  -XX:MaxTenuringThreshold=1 \
  -Dusing.aikars.flags=https://mcflags.emc.gs \
  -Daikars.new.flags=true \
  -jar paper.jar --nogui

7.2.2 参数详解

参数 说明 作用
-Xms4G -Xmx4G 初始/最大堆内存 设为相同值避免动态扩缩
-XX:+UseG1GC 使用 G1 垃圾收集器 适合大堆内存
-XX:+ParallelRefProcEnabled 并行引用处理 减少 GC 暂停
-XX:MaxGCPauseMillis=200 最大 GC 暂停 200ms 降低 GC 停顿感
-XX:+AlwaysPreTouch 启动时预分配内存 减少运行时分配开销
-XX:G1NewSizePercent=30 新生代最小 30% 优化短期对象回收
-XX:G1HeapRegionSize=8M G1 区域大小 适配 Minecraft 工作负载
-XX:MaxTenuringThreshold=1 对象晋升阈值 快速将短命对象回收
-XX:+PerfDisableSharedMem 禁用共享内存性能计数器 避免容器环境问题

7.2.3 内存分配建议

在线人数 推荐内存 Xmx 设置
1-10 4 GB -Xmx4G
10-30 6-8 GB -Xmx8G
30-50 8-12 GB -Xmx12G
50-100 12-16 GB -Xmx16G
100+ 16-24 GB -Xmx24G

注意:不是越多越好!过大的堆会导致 GC 暂停时间变长。超过 24GB 时考虑使用 Folia 或 Velocity 分服。

7.2.4 Java 21 分代 ZGC(实验性)

Java 21 引入了分代 ZGC,暂停时间极短(< 1ms):

java \
  -Xms4G -Xmx4G \
  -XX:+UseZGC \
  -XX:+ZGenerational \
  -XX:+AlwaysPreTouch \
  -XX:+PerfDisableSharedMem \
  -jar paper.jar --nogui
收集器 暂停时间 吞吐量 适用场景
G1GC 50-200ms 大部分服务器(推荐)
ZGC (分代) < 1ms 对暂停敏感的大服
Shenandoah < 1ms 备选方案

7.3 server.properties 调优

7.3.1 视距与模拟距离

# 视距(渲染距离)- 影响客户端加载的区块范围
view-distance=10

# 模拟距离 - 影响服务端运算的区块范围
simulation-distance=8

视距对性能的影响:

view-distance 每玩家加载区块数 内存/玩家 推荐场景
4 81 ~2 MB 小游戏服
6 169 ~4 MB 大型公共服
8 289 ~7 MB 中型服
10 441 ~11 MB 小型服(默认)
12 625 ~15 MB 创造服
16 1089 ~27 MB 仅高性能硬件

最佳实践simulation-distance 应小于或等于 view-distance。建议 simulation = view - 2。

7.3.2 网络压缩

# 网络压缩阈值(字节)
# 低于此大小的包不压缩
network-compression-threshold=256

7.4 Paper 配置调优

7.4.1 chunk-loading-advanced(区块加载)

# config/paper-global.yml

chunk-loading-advanced:
  auto-config-send-distance: true
  player-max-concurrent-chunk-generates: 0    # 0 = 自动
  player-max-concurrent-chunk-loads: 0        # 0 = 自动

7.4.2 实体优化

# config/paper-world-defaults.yml

entities:
  spawning:
    # 降低怪物生成上限
    monsters:
      max-per-chunk: 50      # 默认 70

    # 降低动物生成上限
    animals:
      max-per-chunk: 8       # 默认 10

  entity-activation-range:
    # 降低实体激活范围
    animals: 24               # 默认 32
    monsters: 24              # 默认 32
    misc: 12                  # 默认 16
    villagers: 24             # 默认 32
    flying-monsters: 32       # 默认 48

    # 不活跃实体更新频率
    tick-inactive-goals: true
    inactive-goal-update-rate: 1

  # 掉落物合并半径
  merge-radius:
    exp: 4.0                  # 默认 3.0
    item: 3.5                 # 默认 2.5

  # 掉落物消失时间(tick)
  item-despawn-rate: 4000     # 默认 6000(5分钟→3.3分钟)

  # 箭矢消失时间
  non-player-arrow-despawn-rate: 300   # 默认 300
  creative-arrow-despawn-rate: 30

7.4.3 红石优化

# config/paper-world-defaults.yml

misc:
  # Redstone 实现方式
  # default: 与 Vanilla 相同
  # alternate-current: Paper 优化的红石实现,性能大幅提升
  redstone-implementation: alternate-current

重要alternate-current 是 Paper 引入的红石实现,性能比 Vanilla 提升 10 倍以上,但某些红石机器的行为可能略有不同。如果服务器有大量红石机器,测试后再启用。

7.4.4 Hopper 优化

# config/paper-world-defaults.yml

hopper:
  # 漏斗满时冷却
  cooldown-when-full: true
  # 冷却时间(tick)
  cooldown-full: 8            # 默认 8

  # 禁用漏斗移动事件(性能提升,但某些插件可能受影响)
  disable-move-event: false

7.5 Bukkit/Spigot 层调优

7.5.1 bukkit.yml

# bukkit.yml

spawn-limits:
  monsters: 50          # 默认 70
  animals: 8            # 默认 10
  water-animals: 3      # 默认 5
  water-ambient: 15     # 默认 20
  water-underground-creature: 3  # 默认 5
  axolotls: 3           # 默认 5
  ambient: 5            # 默认 15(蝙蝠等)

chunk-gc:
  period-in-ticks: 400   # 默认 600

ticks-per:
  animal-spawns: 400     # 默认 400
  monster-spawns: 4      # 默认 1(降低生成频率)
  autosave: 6000         # 默认 6000(5分钟)

7.5.2 spigot.yml

# spigot.yml

world-settings:
  default:
    entity-activation-range:
      animals: 24
      monsters: 24
      raiders: 48
      misc: 12
      water: 12
      villagers: 24
      flying-monsters: 32
      tick-inactive-goals: true

    merge-radius:
      exp: 4.0
      item: 3.5

    # 掉落物消失速率
    item-despawn-rate: 4000

    # 区块卸载时保留实体的时间
    nerf-spawner-mobs: false

    # 合并实体更新包
    max-entity-collisions: 4       # 默认 8
    mob-spawn-range: 4             # 默认 8

7.6 实体管理

7.6.1 查看实体统计

# Paper 内置命令
/paper entity list

# 使用 Spark
/spark healthentities

7.6.2 实体清理

# 清除所有掉落物
/kill @e[type=item]

# 清除特定类型的实体
/kill @e[type=zombie,distance=100..]

# 使用 EssentialsX 的清理命令
/remove items
/remove entities

7.6.3 自动实体清理插件

推荐使用 ClearLagg 或自定义脚本:

# ClearLagg 配置示例
# plugins/ClearLagg/config.yml

entity-limits:
  enabled: true
  limits:
    ZOMBIE: 50
    SKELETON: 50
    CREEPER: 30
    ITEM: 100

auto-clear:
  enabled: true
  interval: 300     # 每 5 分钟检查
  items: true
  animals: false
  monsters: false
  warn-players: true
  warn-time: 10     # 清理前 10 秒警告

7.7 区块管理

7.7.1 区块加载优化

# config/paper-global.yml

chunk-loading-advanced:
  # 自动配置区块发送距离
  auto-config-send-distance: true

  # 每个玩家同时加载区块的最大数量
  player-max-concurrent-chunk-generates: 0
  player-max-concurrent-chunk-loads: 0

7.7.2 区块卸载策略

# config/paper-world-defaults.yml

chunks:
  # 自动保存间隔(tick)
  auto-save-interval: 6000

  # 防止区块快速加载/卸载
  delay-chunk-unloads-by: 10s

7.8 网络优化

7.8.1 压缩与协议

# server.properties
network-compression-threshold=256
# 设为 -1 禁用压缩(仅在带宽充足时)
# 设为更低值(如 128)可减少带宽

7.8.2 Tab 补全优化

# config/paper-global.yml
misc:
  # 限制 Tab 补全返回的玩家数量
  max-joins-per-tick: 5

7.9 性能调优检查清单

检查项 推荐值 文件
Java 版本 21+ 系统
Xms = Xmx 相同值 启动参数
G1GC 参数 Aikar’s Flags 启动参数
view-distance 6-10 server.properties
simulation-distance ≤ view - 2 server.properties
monster spawn limits 50 bukkit.yml
animal spawn limits 8 bukkit.yml
entity activation range 24 spigot.yml
redstone-implementation alternate-current paper-world-defaults.yml
hopper cooldown true paper-world-defaults.yml
chunk unloads delay 10s paper-world-defaults.yml

7.10 硬件优化建议

7.10.1 CPU

要求 说明
主频优先 Minecraft 主线程是单线程的,高主频比多核更重要
推荐 4 核+ 辅助线程(区块加载、GC)需要额外核心
Intel/AMD 两者均可,关注单核性能

7.10.2 内存

要求 说明
DDR4/DDR5 高频率内存有助于性能
ECC 推荐 生产环境推荐使用 ECC 内存
预留空间 系统本身需要 1-2GB

7.10.3 存储

类型 性能 推荐
NVMe SSD ⭐⭐⭐⭐⭐ 强烈推荐
SATA SSD ⭐⭐⭐⭐ 推荐
HDD ⭐⭐ 仅小型服
网络存储 ⭐⭐ 不推荐(延迟高)

7.11 常见问题

Q1:TPS 持续低于 20?

# 1. 使用 Spark 定位瓶颈
/spark profiler --timeout 300

# 2. 检查实体数量
/paper entity list

# 3. 检查红石机器
# 大型红石机器是 TPS 杀手

# 4. 降低视距
# 在 server.properties 中降低 view-distance

Q2:GC 暂停导致卡顿?

# 1. 确认使用了 Aikar's Flags
# 2. 检查内存是否够用
/memory

# 3. 查看 GC 日志
# 添加 JVM 参数:-Xlog:gc*:file=gc.log:time,uptime,level,tags

# 4. 如果堆内存 > 16GB,考虑使用 ZGC

Q3:玩家传送时卡顿?

# config/paper-world-defaults.yml
chunks:
  delay-chunk-unloads-by: 10s   # 保留已访问区块

7.12 本章小结

调优方向 关键操作 预期效果
JVM 参数 使用 Aikar’s Flags 减少 GC 暂停 50%+
视距优化 view=8, simulation=6 降低 CPU 和内存 30%
实体优化 降低激活范围和生成上限 稳定 TPS
红石优化 alternate-current 红石性能提升 10x
存储优化 使用 NVMe SSD 区块加载速度提升 3-5x

扩展阅读