redfish
本帖最后由 redfish 于 2020-7-9 19:35 编辑

关于服务端启动项的优化

写这个的目的呢,之前想分享被批灌水了,说没心得,所以啃了一下响应的内容。

下面是正文:

其实启动参数围绕的主要就是gc的机制和相关的配置。

比较重要部分呢,会用红色标记,其他都是原理相关的和解释。


一、
GC的功能,就是回收内存的垃圾(gabageCollect)。就是尽量让内存不要占用太多,但是,这一回收过程会短暂的暂停世界(stop_the_wolrd),也就停下手头的任务。这样对于MC的服务端来说,如果频繁进行垃圾回收,或者垃圾回收的时间过长,都会影响到TPS

那么,GC优化的目标就是减少垃圾回收次数和占用时间。


二、
GC方式的选择(参考https://blog.csdn.net/high2011/article/details/80177473

垃圾回收器目前分为6种类型, 串行,并行,并发标记,G1

小数据量和小型应用,使用串行垃圾回收器即可。
对于对响应时间无特殊要求的,可以使用并行垃圾回收器和并发标记垃圾回收器。(中大型应用)
对于heap可以分配很大的中大型应用,使用G1垃圾回收器比较好,进一步优化和减少了GC暂停时间。

可以看到G1整好符合MC服务器的优化要求,所以G1是比较好的选择。


三、
参数的设置。这里就完全参考,只做一些解释
https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/
作者是aikarpaper版的timings就是他写的

首先给出他的推荐参数
  1. java -Xms10G -Xmx10G -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 paperclip.jar nogui
复制代码


作者的建议:
1、不要用尽设备的内存,保留1-1.5G的配置给系统。
2、建议内存6G-10G,给更多的空间,G1GC可以更好的工作。
3、如果分配超过12G,用下面的数值替代对应的配置
  1. -XX:G1NewSizePercent=40
  2. -XX:G1MaxNewSizePercent=50
  3. -XX:G1HeapRegionSize=16M
  4. -XX:G1ReservePercent=15
  5. -XX:InitiatingHeapOccupancyPercent=20
复制代码

4、如果需要记录GClog,可以启用下面的配置
  1. Java 8-10:-Xloggc:gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=1M
  2. Java 11+:-Xlog:gc*:logs/gc.log:time,uptime:filecount=5,filesize=1M
复制代码


接下来是具体配置项的解释
一些翻译参考了https://tech.meituan.com/2016/09/23/g1.html

1、-Xms matching -Xmx
初始堆和最大堆保持一致,
HAVE UNUSED MEMORY!Unused memory is wasted memory
空闲的内存都是浪费


2、G1NewSizePercent
就是年轻代首次分配的空间大小
Minecraft has an extremely high a memory allocation rate, ranging to at least 800 Megabytes a second on a 30 player server! And this is mostly short lived objects (Block Position)
MC会频繁触发内存分配,这一配置项呢会扩大(Eden)首次分配的空间,所以从默认的5%提高到了40%
30人服务器至少保证800M的空间


3、G1MixedGCLiveThresholdPercent
年老代空间中的存活对象的占比,只有在此参数之下,才会被选入进入回收
为了分配更多空间给年轻代,这个占比提高到了90%

4、G1ReservePercent=20
待分配空间,因为mc的内存分配更新很疯狂,所以从默认的10%提高到20%

5、MaxTenuringThreshold=1
年轻代到老年代晋升次数需求
还是因为mc产生新生代速度太快,所以很快会溢出,而每次晋升都需要复制,所以直接把这个值设为1

6、SurvivorRatio=32
年轻代存活率,降低以分配更多空间给新进的年轻代

7、AlwaysPreTouch
强制分配操作系统的内存空间--(简单了解了一下,就是老年代才会向系统申请内存空间,而启动这个选项后,-Xms分配的空间被写入了0,可以直接使用。),作者的说明提到就是强制使用了透明大页管理(Transparent Huge Pages)

8、+DisableExplicitGC
作者的意思呢,就是有的插件作者觉得自己能处理GC,就在插件里处理了,但是作者不信任,所以禁用了这种方式。

9、MaxGCPauseMillis=200
GC 的最大停止时间,200就是4tick

10、+ParallelRefProcEnabled
优化GC对弱引用检查的多线程支持,大概是这个意思

--XX:+UseLargePagesInMetaspace
--XX:+UseTransparentHugePages
这两个呢是大页面管理的内容,完全懵逼,需要jvm启用这个功能的话要加这个参数



因为很多还是一知半解,希望有大佬能指正

当然,参数我都有实践过的
1.15.2生电服务器+粘液科技,虽然人不多,但都常年TPS保持20,内存只分配了6G

小冰糖a
个人开这么多年服,实际体验是完全不需要启动参数,让虚拟机自己去调整...
甚至连广受好评的G1GC都不用emmm
不是拆台,当然用启动参数也没什么事,就是发表下自己的意见

redfish
本帖最后由 redfish 于 2020-7-9 20:16 编辑
深拥v 发表于 2020-7-9 19:55
个人开这么多年服,实际体验是完全不需要启动参数,让虚拟机自己去调整...
甚至连广受好评的G1GC都不用emmm ...

但是我看到有问答版发的有TPS的问题,然后一看内存占用和CPU根本没满,这种问题优化游戏有用吗
这里简单说一下
配置参数的调优不是减少内存的使用,是减少内存垃圾回收占用的时间和频率,因为垃圾回收会停止整个虚拟机

小冰糖a
redfish 发表于 2020-7-9 19:58
但是我看到有问答版发的有TPS的问题,然后一看内存占用和CPU根本没满,这种问题优化游戏有用吗 ...

内存和CPU占满了也不是什么好事,,,
关于TPS低的原因太多了,最好是现场分析

redfish
深拥v 发表于 2020-7-9 20:00
内存和CPU占满了也不是什么好事,,,
关于TPS低的原因太多了,最好是现场分析
...

我知道,但这绝对是一个方向,你不能指望频繁触发GC的虚拟机能提供好的吞吐量

清音巡绫
java垃圾回收机制.jpg
甩垃圾车

Daleynf
redfish 发表于 2020-7-9 19:58
但是我看到有问答版发的有TPS的问题,然后一看内存占用和CPU根本没满,这种问题优化游戏有用吗
这里简单说 ...

配置是硬道理,启动参数顶多辅助作用
并且占用高就是好现象吗

redfish
本帖最后由 redfish 于 2020-7-10 14:55 编辑
Daleynf 发表于 2020-7-10 13:57
配置是硬道理,启动参数顶多辅助作用
并且占用高就是好现象吗

cpu 没满,但是tps有问题,说明设备性能根本没发挥出来,只能是别的问题,而可能的原因之一就是GC的问题,这时候游戏在怎么优化也没用游戏优化只是在限制玩家的自由,不让干着,不让干那。
cpu当然不要求占用高,但是你占用不高却出问题了就是使用方式有问题了。
内存 利用率低,这个请看上面的理解。如果看都没看就说没用当我没说。