-
Notifications
You must be signed in to change notification settings - Fork 1
optimize
优化相关 :
从系统的选择优化
通常, 我们作为服务器的操作系统有两种, 但是也不排除有人使用废弃的MacBook来作为服务器, 所以我们将从这三个系统当中介绍他们的优劣, 并给出我们的推荐:请尽可能选择Linux无GUI的版本
。
优劣表
条目/系统 | Windows Server | Linux | 更好的选择 |
---|---|---|---|
开箱带有GUI | ✔️ | ❌ | Windows Server |
社区支持是否丰富 | ✔️ | ✔️ | 平分秋色 |
是否可以脱离GUI工作 | ❌ | ✔️ | Linux |
当管理员网络不佳时是否能正常使用 | ❌ | ✔️ | Linux |
GUI崩溃是否导致无法正常使用 | ✔️ | ❌ | Linux |
是否支持容器化 | ❌ | ✔️ | Linux |
是否开源 | ❌ | ✔️ | Linux |
需要付费 | ✔️ | ❌ | Linux |
安装软件是否方便(可否自动化完成) | ❌ | ✔️ | Linux |
便于上手 | ✔️ | ❌ | Windows Server |
这或许是市场上占有率最高的操作系统了, 但这并不是我们作为一个服务器系统的首选。
一般来说, 这是我们选择服务器的最佳选择。
CentOS是Linux的一个分支,是Red Hat Enterprise Linux的再编译版本,可靠性和稳定性极高
但是CentOS即将失去支持,如果你要使用建议使用CentOS7作为服务器操作系统(在国内有相当多的文档以供参考)
国内服务器市场对于CentOS有着谜之喜爱, 但随着CentOS被放弃支持, 请逐步的转移到Debian或Ubuntu(如果你很有钱, 可以考虑Red Hat)
Debian稳定版本是所有Linux发行版中最稳定的版本, 以坚若磐石来称呼都不为过, 唯一的问题就是它包管理器中的软件通常都已经过时了(对, 首次发行时就过时了), 不过这对服务器来说并不是什么大问题
还有就是, Debian对于自由非常看重, 所以你根本没法在它自带的仓库里找到专有软件, 这些在另一个单独的仓库中
Ubuntu是Debian的下游分支, 拥有广泛的软件支持, LTS版本两年一更, 相当稳定, 也是全球范围最受推荐的Web服务器操作系统
从Java的选择优化
目前主流的两种Java的实现是OpenJ9和HotSpot
我们这里选择OpenJ9, 因为从某些方面来讲, 它在服务器上会更"快"一些, 我们后续的优化都将围绕J9这个实现来开展
如果你发现你的模组会在使用OpenJ9的时候出现闪退, 请尝试使用HotSpot
从启动参数优化
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> |
本章节参考文章:
从配置文件优化
上述的优化选择只是一小部分的优化, 还有更多的优化可以在配置文件中做到
通过server.properties优化
参阅: server.properties - Minecraft Wiki, 最详细的官方我的世界百科
条目 | 作用 | 建议 | 可输入的值 | 默认 |
---|---|---|---|---|
view-distance | 视距 | 4-6 | int | 10 |
generate-structures | 生成特殊结构 | 无 | boolean | true |
use-native-transport | 是否使用针对Linux平台的数据包收发优化。此选项仅会在Linux平台上生成。 | true | boolean | true |
通过第三方核心配置优化
配置bukkit.yml来优化服务器
由于Bukkit.yml文档结构较为特殊, 此文档中只标记了需要关注的父项, 具体的配置请点击链接查看文档
条目 | 作用 | 建议 | 可输入的值 | 默认 |
---|---|---|---|---|
spawn-limits | 决定每个世界可以生成多少动物或生物 | |||
chunk-gc | CraftBukkit 将检查本应卸载但由于某种原因未能这样做的块 | |||
ticks-per | 确定特定功能的滴答延迟 | 此处需要关注的是子项autosave,将这个选项设为0然后手动控制,将会避免突如其来的IO跑满引起的服务器崩溃 |
配置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.yml来优化服务器
条目 | 作用 | 建议 | 可输入的值 | 默认 |
---|---|---|---|---|
keep-spawn-loaded | spawn区块是否常驻内存 | false | boolean | true |
optimize-explosions | 是否开启爆炸算法优化 | true | boolean | false |
从服务器插件的选择进行优化
通过插件进行优化也是不错的选择, 使用插件可以做到更加智能的优化!
或许这里会比我讲述的更加清楚
欢迎使用minecraftctl,如果有问题,请提交issues或在discussions讨论
同样, 我也非常欢迎您提交PR