Skip to content

optimize

MemoryShadow edited this page Jan 8, 2023 · 6 revisions

Optimize

优化相关 :

Optimizing from the selection OS

从系统的选择优化

通常, 我们作为服务器的操作系统有两种, 但是也不排除有人使用废弃的MacBook来作为服务器, 所以我们将从这三个系统当中介绍他们的优劣, 并给出我们的推荐:请尽可能选择Linux无GUI的版本

优劣表
条目/系统 Windows Server Linux 更好的选择
开箱带有GUI ✔️ Windows Server
社区支持是否丰富 ✔️ ✔️ 平分秋色
是否可以脱离GUI工作 ✔️ Linux
当管理员网络不佳时是否能正常使用 ✔️ Linux
GUI崩溃是否导致无法正常使用 ✔️ Linux
是否支持容器化 ✔️ Linux
是否开源 ✔️ Linux
需要付费 ✔️ Linux
安装软件是否方便(可否自动化完成) ✔️ Linux
便于上手 ✔️ Windows Server

Windows Server

这或许是市场上占有率最高的操作系统了, 但这并不是我们作为一个服务器系统的首选。

Linux

一般来说, 这是我们选择服务器的最佳选择。

CentOS

CentOS是Linux的一个分支,是Red Hat Enterprise Linux的再编译版本,可靠性和稳定性极高

但是CentOS即将失去支持,如果你要使用建议使用CentOS7作为服务器操作系统(在国内有相当多的文档以供参考)

国内服务器市场对于CentOS有着谜之喜爱, 但随着CentOS被放弃支持, 请逐步的转移到Debian或Ubuntu(如果你很有钱, 可以考虑Red Hat)

Debian

Debian稳定版本是所有Linux发行版中最稳定的版本, 以坚若磐石来称呼都不为过, 唯一的问题就是它包管理器中的软件通常都已经过时了(对, 首次发行时就过时了), 不过这对服务器来说并不是什么大问题

还有就是, Debian对于自由非常看重, 所以你根本没法在它自带的仓库里找到专有软件, 这些在另一个单独的仓库中

Ubuntu

Ubuntu是Debian的下游分支, 拥有广泛的软件支持, LTS版本两年一更, 相当稳定, 也是全球范围最受推荐的Web服务器操作系统

Optimizing from the choice of Java

从Java的选择优化

目前主流的两种Java的实现是OpenJ9和HotSpot

我们这里选择OpenJ9, 因为从某些方面来讲, 它在服务器上会更"快"一些, 我们后续的优化都将围绕J9这个实现来开展

如果你发现你的模组会在使用OpenJ9的时候出现闪退, 请尝试使用HotSpot

Optimize from startup parameters

从启动参数优化

java -server -Xmx最大内存M -Xms初始内存M -Xss512K -Xaggressive -Xalwaysclassgc [-XcompilationThreads4] -Xconmeter:dynamic [-Xgcpolicy:metronome] -Xshareclasses [-Xtune:virtualized] -jar <xxx.jar>
参数含义
参数 含义 示例
-server 服务器运行模式, 为持久运行优化 java -server <xxx.jar>
-Xms 初始堆大小, 一般是物理内存的1/64(<1GB), 和-Xmx一样大可以节省一点CPU资源 java -Xms1024M -jar <xxx.jar>
-Xmx 最大堆大小, 一般是物理内存的1/4(<1GB), 不过MC服务端对于内存的要求挺高的, 能用上的都用上吧 java -Xmx2048M -jar <xxx.jar>
-Xss 每个线程的堆栈大小, OpenJ9默认是1024KB, 不过另一位服主的帖指出, 对于MC, 512KB足够了 java -Xss512K -jar <xxx.jar>
-Xaggressive 更激进的性能优化, OpenJ9的文档指出它会在未来版本作为默认选项 java -Xaggressive -jar <xxx.jar>
-Xalwaysclassgc 始终在全局垃圾回收期间执行动态类卸载检查, 减少内存占用 java -Xalwaysclassgc -jar <xxx.jar>
-XcompilationThreads4 指定JIT编译器使用的编译线程数, 最高只能设到4, 如果服务器物理核心不足4个, 设置成物理核心的一半 java -XcompilationThreads4 -jar <xxx.jar>
-Xconmeter:dynamic 动态检测大对象区或小对象区域的使用情况 java -Xconmeter:dynamic -jar <xxx.jar>
-Xgcpolicy:metronome 启用metronome垃圾收集器, 可以让垃圾收集时的瞬卡更短暂。仅支持AIX(没人用这个开MC服吧)和Linux, Windows就不要加了。 java -Xgcpolicy:metronome -jar <xxx.jar>
-Xshareclasses OpenJ9的高速类共享功能, 减少内存占用与启动时间, 适合多个JVM运行相似代码的环境, 或定期重启JVM的环境, 对于群组服非常有用。 java -Xshareclasses -jar <xxx.jar>
-Xtune:virtualized 假如你的服务器运行在虚拟化环境中(例如阿里云、腾讯云等等), 使用这一选项可以在空闲时减少OpenJ9 VM CPU消耗, 有可能会略微提升性能与减少内存占用, 不过代价是吞吐量的少量损失。实体机环境不要加! java -Xtune:virtualized -jar <xxx.jar>
-XX:+AggressiveOpts 尽可能的使用更多对性能有帮助的优化功能 java -XX:+AggressiveOpts -jar <xxx.jar>
-XX:+UseCompressedOops 指针压缩, 可以减少一定的内存占用(64位才支持) java -XX:+UseCompressedOops -jar <xxx.jar>
# 一位朋友(linfon18)提供了这样的一段额外吟唱, 性能要提升不少
# 如果你正在使用minecraftctl, 可以将其放在minecraftctl.conf的UserExtraParameters字段
-XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=8 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=true -Daikars.new.flags=true
参数含义
参数 含义 示例
-XX: 非Stable参数, 此类参数各个jvm实现会有所不同, 将来可能会随时取消,需要慎重使用 java -XX:+ParallelRefProcEnabled -jar <xxx.jar>
-XX:+ParallelRefProcEnabled GC会花很多时间尝试找出哪些引用能被清理 java -XX:+ParallelRefProcEnabled -jar <xxx.jar>
-XX:MaxGCPauseMillis GC最大可暂停时间,单位毫秒 java -XX:MaxGCPauseMillis=200 -jar <xxx.jar>
-XX:+UnlockExperimentalVMOptions 解锁实验参数,允许使用实验性参数,JVM中有些参数不能通过-XX直接复制需要先解锁,比如要使用某些参数的时候,可能不会生效,需要设置这个参数来解锁 java -XX:+UnlockExperimentalVMOptions -jar <xxx.jar>
-XX:+DisableExplicitGC 关闭System.gc()触发的FullGC java -XX:+DisableExplicitGC -jar <xxx.jar>
-XX:-OmitStackTraceInFastThrow 省略异常栈信息从而快速抛出, 具体请参考这篇文章 java -XX:-OmitStackTraceInFastThrow -jar <xxx.jar>
-XX:+AlwaysPreTouch 启动时就真正的分配内存 java -XX:+AlwaysPreTouch -jar <xxx.jar>
-XX:G1NewSizePercent 缩小堆空间年轻代的占比 java -XX:G1NewSizePercent=30 -jar <xxx.jar>
-XX:G1MaxNewSizePercent 减少最大年轻代大小 java -XX:G1MaxNewSizePercent=40 -jar <xxx.jar>
-XX:G1HeapRegionSize 缩小堆region空间大小 java -XX:G1HeapRegionSize=8M -jar <xxx.jar>
-XX:G1ReservePercent 设置垃圾的占用率 java -XX:G1ReservePercent=20 -jar <xxx.jar>
-XX:G1HeapWastePercent 提高mixedGC的频率 java -XX:G1HeapWastePercent=5 -jar <xxx.jar>
-XX:G1MixedGCCountTarget 指定一个周期内触发Mixed GC最大次数,默认值8 java -XX:G1MixedGCCountTarget=8 -jar <xxx.jar>
-XX:InitiatingHeapOccupancyPercent 通过修改增加自适应 IHOP -XX:-G1UseAdaptiveIHOP。来覆盖掉G1自动计算出的值 java -XX:InitiatingHeapOccupancyPercent=15 -jar <xxx.jar>
-XX:G1MixedGCLiveThresholdPercent 通过不将要GC的内容放入候选集合集中来避免收集需要大量时间来收集的区域 java -XX:G1MixedGCLiveThresholdPercent=90 -jar <xxx.jar>
-XX:G1RSetUpdatingPauseTimePercent 降低Rset停顿耗时 java -XX:G1RSetUpdatingPauseTimePercent=5 -jar <xxx.jar>
-XX:SurvivorRatio 表示Eden:From:To的比值,比如这里配置-XX:SurvivorRatio=3,那么Eden:From:To=3:1:1;这个JVM参数默认是8 java -XX:SurvivorRatio=32 -jar <xxx.jar>
-XX:MaxTenuringThreshold 设置垃圾的最大年龄. 默认为15 . 最大也是15,在jdk8中. 范围为 0到15. java -XX:MaxTenuringThreshold=1 -jar <xxx.jar>
-Dusing.aikars.flags 尚未知其含义 java -Dusing.aikars.flags=true -jar <xxx.jar>
-Daikars.new.flags 尚未知其含义 java -Daikars.new.flags=true -jar <xxx.jar>

本章节参考文章:

Optimize from configuration file

从配置文件优化

上述的优化选择只是一小部分的优化, 还有更多的优化可以在配置文件中做到

Optimized through server.properties

通过server.properties优化

参阅: server.properties - Minecraft Wiki, 最详细的官方我的世界百科

条目 作用 建议 可输入的值 默认
view-distance 视距 4-6 int 10
generate-structures 生成特殊结构 boolean true
use-native-transport 是否使用针对Linux平台的数据包收发优化。此选项仅会在Linux平台上生成。 true boolean true

Optimized through third-party core configuration

通过第三方核心配置优化

bukkit

配置bukkit.yml来优化服务器

参阅: Bukkit.yml - BukkitWiki

由于Bukkit.yml文档结构较为特殊, 此文档中只标记了需要关注的父项, 具体的配置请点击链接查看文档

条目 作用 建议 可输入的值 默认
spawn-limits 决定每个世界可以生成多少动物或生物
chunk-gc CraftBukkit 将检查本应卸载但由于某种原因未能这样做的块
ticks-per 确定特定功能的滴答延迟 此处需要关注的是子项autosave,将这个选项设为0然后手动控制,将会避免突如其来的IO跑满引起的服务器崩溃
spigot

配置spigot.yml来优化服务器

参阅: spigot.yml Konfiguration | SpigotMC - High Performance Minecraft

条目 作用 建议 可输入的值 默认
save-user-cache-on-stop-only 是否仅在开关服务器时才保存玩家信息 true boolean false
view-distance 控制将在每个玩家周围加载的区块数量 4-6 1-15,int 10
chunks-per-tick 是指每tick(1/20秒)扫描计算多少区块, 计算的内容是作物的生长 350 int 650
max-tick-time 在服务器跳到下一个任务之前, (平铺)实体操作可以消耗的时间(以毫秒为单位)进行计算 tile:10-20,entity:20-25 int tile: 50, entity: 50
max-tnt-per-tick 每tick(1/20秒)最多计算多少TNT爆炸 20 int 20
paper

配置paper.yml来优化服务器

条目 作用 建议 可输入的值 默认
keep-spawn-loaded spawn区块是否常驻内存 false boolean true
optimize-explosions 是否开启爆炸算法优化 true boolean false

Optimize from the selection of server plug-ins

从服务器插件的选择进行优化

通过插件进行优化也是不错的选择, 使用插件可以做到更加智能的优化!

或许这里会比我讲述的更加清楚