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 |
扩展阅读