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

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=8MG1 区域大小适配 Minecraft 工作负载
-XX:MaxTenuringThreshold=1对象晋升阈值快速将短命对象回收
-XX:+PerfDisableSharedMem禁用共享内存性能计数器避免容器环境问题

7.2.3 内存分配建议

在线人数推荐内存Xmx 设置
1-104 GB-Xmx4G
10-306-8 GB-Xmx8G
30-508-12 GB-Xmx12G
50-10012-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
收集器暂停时间吞吐量适用场景
G1GC50-200ms大部分服务器(推荐)
ZGC (分代)< 1ms对暂停敏感的大服
Shenandoah< 1ms备选方案

7.3 server.properties 调优

7.3.1 视距与模拟距离

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

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

视距对性能的影响:

view-distance每玩家加载区块数内存/玩家推荐场景
481~2 MB小游戏服
6169~4 MB大型公共服
8289~7 MB中型服
10441~11 MB小型服(默认)
12625~15 MB创造服
161089~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-distance6-10server.properties
simulation-distance≤ view - 2server.properties
monster spawn limits50bukkit.yml
animal spawn limits8bukkit.yml
entity activation range24spigot.yml
redstone-implementationalternate-currentpaper-world-defaults.yml
hopper cooldowntruepaper-world-defaults.yml
chunk unloads delay10spaper-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

扩展阅读