至此,1 老师,为什么没有课间休息
2 需要更多的快乐 (第三次修订目录时添加)
3 创建你的服务器团队 (第三次修订目录时添加)
就已经完毕了,步入
4 正式步入服务器优化 还是手把手教你的教程喵
4.1 对 服务器 从配置文件上 进行优化
4.2 对 服务器插件 从数量,配置上进行优化
4.3 对 jvm调参 从最基础的初步认识开始 进行优化 (第三次修订目录时添加)
前文已提及部分内容 4.4 从 服主心理 开始分析 让你深刻体会 哪些事有必要做 哪些事完全无意义
4.5 从 玩家心理 开始分析 为什么服主要做这些事 为什么有些内容无意义
[anchor=TPS]前排提示[/anchor] : 从头至尾都有可以优化的内容,新人完全可以从头看到尾,因为文中各处都穿插有优化教程
在教程开始前,我需要向大家介绍一下,何为tps 很多人并不知道tps的机制存在的意义 首先从表面上来说,tps就是反应你服务器流畅程度的量度 但什么会决定tps呢?很多人认为cpu处理事件等的能力决定了tps 这里的误区实在是太大了,我在后文会有一个总结 我们先提出六个难度很大的误区问题,请读者仔细思考: 1、假设服务器cpu使用了100%,而实际处理当前所有任务需要用到120%,那么tps是否会在18左右徘徊呢? 2、tps和ping是否存在一定的关系?若存在关系,可以拟合出什么函数;若不存在,那么tps和ping分别指什么? 3、RAM会不会影响tps呢? 4、带宽和延迟之间存在关系吗? 5、tps存在的意义是什么? 6、tps高于20、低于20、低于15,服务器分别会出现什么表现?
的确很有难度嘛,我承认这六个问题不简单的,所以下面我来讲解题过程好了 我们从第2题讲起,tps和ping的关系是什么? 我们首先了解tps的英文 Ticks per second,每秒多少ticks,这是针对服务端处理客户端数据而言的; 而ping则是客户端处Internet网络连接情况的量度;所以他们两个是完全不一样的 这个问题很简单,但是对于下面几个问题的解题 意义重大 接下来我们讲第3题,RAM会不会影响tps呢? 答案是不会的,它作为能力的量度,tps越低,则玩家普遍越卡。tps低于15时,客户端的体验就很糟糕了 而当RAM不够用时,更多的情况下的表现是服务端直接崩溃,而非卡顿。 我们看完了第2题和第3题,那么第4题是不是就迎刃而解了呢? 由第2题易得 服务器可以在上下行仅为4MB/s时带动120个玩家,虽然玩家有点卡,但tps仍然可以为20,这不难做到。 所以带宽上下行与tps之间根本没有半毛钱的关系 随后,第1题,cpu使用情况和tps之间的关系是怎样的? 前spigots开发者之一 ammer2 给出了一个非常形象的比喻 "想象一下,你有一个闹钟,每分钟都会响一次,在响的同时,这个闹钟会发出一次'tick'响声(tick是拟声词)" "在每分钟内,你都必须要去做一些事,这些事可以很简单,比如从你的桌上把水杯放到架子上" "但也可以很麻烦且困难,比如进行一次大扫除" "在你的服务器内,同样也有这个闹钟的概念,它被称作tick" "每个ticks内服务器都会执行诸如生成小怪,加载块,执行物理检查等工作" "当你要做的事很少的时候,你可以很快的做完它,然后把剩下来的时间拿来休息" "但当你的服务器要在一段时间内做很多很多事的时候,这就不可能正常完成了" "所以你的服务器会调整一下这个闹钟叫的频率,延长一下时间" "你的工作必须在两次闹钟间隔内完成,如果闹钟每分钟响2次,那么你的工作就只能用30秒完成" "当工作很多的时候,你可以让它一分钟响1次,那么你就有60秒去完成工作了" "原来1分钟可以响两次,所以我们定义一个量度为2,在你修改时间后,这个量度就只有1了" "而ticks也是这个原理,原来是每秒20ticks,当要处理很多事情的时候,你不得不延长1ticks的时间" "那么tps就会从20往下掉了,这能减少你服务器的运算负担" 他也给出了提升tps的最简单方法: 通常,这可以通过增加cpu的使用量来解决,因为服务器一直在工作(尽管并非在所有情况下都如此!) 所以最野鸡且简单的方法: 你可以提升u的性能,或者用多个核心线程(分部部署),或者用多个cpu来提升tps
所以让我们简单的从第4题中提取第5题的答案: tps存在的意义是什么? 让你的服务器可以完成他们应完成的计算,同时让你的服务器休息一下 最后,我们佛系地解答一下第6题: tps高于20、低于20、低于15,服务器分别会出现什么表现? tps高于20: 一般不会出现这种情况,但你当然可以让它出现 用上文tps计算原理来理解这个问题的话,这会让服务器的'运算效率'表现得更高 这会使您的服务器执行相同的操作,但每秒执行更多次 假设服务器在每X ticks内会移动怪物,让草皮生长,并计时药水效果 X次。 当tps翻倍时,小怪的移动速度就会快两倍,农作物的生长速度就会快两倍。药水效果的消耗速度会快两倍,等等。 tps低于20: 同上 生物的移动速度会变慢,农作物的生长速度会变慢,等等 tps低于15: 我们在第3题处讲过了,这会让玩家的体验极度下降 一般来说,在tps低于17时就能被玩家感受到了,高于17时一般不需要紧张,不影响体验
综上: tps与带宽上下行、RAM完全无关;
你需要区分tps和ping的本质区别;并了解到cpu是提升tps的方法之一;
如果你不能回答出tps的计算方法,以及其存在的原因与必要性,请再读一下本段文字
4.1 对 服务器 从配置文件上 进行优化
警告, 下方所有讲解仅针对版本高于或等于1.8的服务器
警告, 本页面不再添加新的内容,仅作勘误修改
警告, 本页面的更新将一并移动至 6.3章 ,由于黑科技比较多,欢迎大家在本章后继续阅读6.3章,并提出建议
本章于2020.2.14进行了最后一次勘误向的大更新!后续将在6.3章内继续更新
这我没准备教案,因为隔壁哒哒翻译过了,最后查重率肯定太高,所以我就不翻译了
[anchor=Bukkit]我们[/anchor]这里介绍3个文件 bukkit.yml、 spigots.yml、 paper.yml 的优化教程(可点,前往哒哒的翻译贴)
其中也会穿插有上文第四章最下方server.properties内的设置
我懒得去问能不能授权黏贴过来,所以我就不贴了,用自己的话来给大家讲讲这些文件吧
在讲之前,麻烦大家先去阅读一下 bukkit.yml,然后再听我瞎扯
我会讲一些优化的东西( 蓝色数字),也会讲一些几乎没有介绍的不正经的隐藏内容( 少女粉数字)
-_-_-_bukkit.yml-_-_-_
建议开两个页面,一边看bukkit.yml,一边看我这里
1、一上来第 22 行(哒哒贴内),和前文server.propertie里是否开启地狱是一样的
allow-end: true
把这里设置为false的话,就不会加载末地了,至于是否删除世界文件夹,请看下去
适用:
1、小游戏,GTA,或任何用不到 地狱 与 末地 的游戏玩法
请将两处设置为false,并删除世界文件夹
2、当你不希望玩家通过地狱门和末地传送门前往地狱或末地,但希望可以通过多世界等 传送过去的话
请将两处设置为false,但保留世界文件夹
______________________________
2、这次是哒哒贴内40行,他翻译的非常蹩脚,这个是玩家在退出服务器后多久才能再次进服的限制,单位是毫秒
connection-throttle: 4000
这个和优化关系不大,和假人集群倒是有点关系,但是改这个阈值也防不住,毕竟假人的名字都不一样
一般来说是不要动这个阈值的,虽然你动和没动的区别不大
讲这个纯粹是因为哒哒的汉化介绍太蹩脚了
______________________________
3、53-65行,每个世界 看问题2生物 可生成的数量上限
spawn-limits:
monsters: 70 #——> 怪物
animals: 15 #——> 动物
water-animals: 5 #——> 水中生物
ambient: 15 #——> 蝙蝠
常见问题:
1、我的确增大了数值,但是在服务器里似乎没有起任何作用
答: 是的,spigots和paper限制了生成在玩家周围生物的数量,随着玩家数量提升与上下限的限制
这会导致可以生成生物的空间变小,同样也影响了可生成的数量
同时影响内存中怪物的最大数量,这就导致了 如果你增大默认数值,游戏中和原先几乎没什么区别
如果你的玩家足够分散的话,是可以看到上限的
2、为什么有些教程里说这个设置是,"设置为70,如果有10个玩家,就能生成700个生物"(按人数算)
答: 我去查了一些资料和一些被官方回答了的提问,两种说法都是有的,但我认为是按人数算的
而我倾向于后者,按人数算,我在下方列出了一些证据
但由于问题1的存在,所以在实际服务器中,这两个说法基本没差别,别纠结了
下方内容参考了Bukkit用户andune的方法
研究表明 "每个世界" , "每个区块" 的说法都是不准确的
先来看下原版的wiki,虽然这在后文没什么大用
https://minecraft.gamepedia.com/Spawn#Mob_Spawning
原版内是允许怪物在玩家周围7个区块内生成
而回到bukkit
查了代码后,我们可以得到一个动态公式来计算生成量
world.a(enumcreaturetype.a()) <= limit * b.size() / 256
我们可以简单的将其转换为
A <= L * B / 256
其中
A代表 单个世界内怪物/动物/水中生物/蝙蝠的数量
L代表 我们在上方bukkit.yml中定义的限制,例如怪物是70,动物是15
B代表 玩家周围当前已加载的"可生成怪物区块"的数量,下文简称"怪物区块"
B的计算结果一般是每个玩家周围有256怪物区块(16x16),换言之,这个公式的B只需要除以256就能得到玩家的数量
但需要根据多个玩家重叠的怪物区块块进行调整
以最简单的情况进行推算,大前提是所有区块都已经被加载了
我们假设所有玩家相距足够远,之间也没有重叠的怪物区块,并将服务器的所有玩家数量定义为P
这时必定有 "A <L * P"。同样的,右侧"L * P"代表当每个玩家登录到服务器时,可以生成的怪物数量会增加L
这时我们已经发现,这个是根据玩家数量来计算的,已经推翻了绝大多数结论
我们先总结一个不完善的结论
假设你设置了monsters: 70,服务器如果有10个玩家,那么就可以生成700个怪物
这个结论在某种意义上的确是正确的
如果你安装了worldguard,可以使用指令/wg report来看一下生成量
会得到一个大约的数值,但这个数值是计算重叠怪物区块情况的,所以不会准确
或许你注意到了 后文都没有提到"世界",只有最初的公式是世界相关的
上方为简化计算做出的假设并没有说明是在多个世界的情况里
所以实际情况是怎么样的呢?
实际情况就是,你大爷还是你大爷
world.a(enumcreaturetype.a()) <= limit * b.size() / 256
你公式还是你公式,bukkit里也只有这个玩意来计算上限
所以仍然可以得出结论
假设monsters: 70,有15个玩家,10个在世界A,5个在世界B
A世界最多700个怪物
B世界最多350个怪物
但由于问题1的存在,所以在实际服务器中,这两个说法基本没差别,别纠结了
|
3、刷怪笼生成的怪物会被这个限制吗?
答: 不会,如果你了解原版就会知道,刷怪笼刷出怪物的数量是自带一个上限的
刷出来的怪不会被计入上面 可生成的数量上限,也不会互相影响
bukkit这里的设置只会影响自然生成的生物 (SpawnReason.NATURAL)
4、我发现server.properties下有spawn-animals=true和spawn-monsters=true
答: 如果你要禁止生物自然生成的话,请在bukkit下面设置monsters: 0 (当然可能是animals: 0 或者别的)
如果你同时不希望刷怪笼刷怪的话,请在bukkit下设置,同时在server.properties下面设置
______________________________
4、70-77行 chunk-gc:
chunk-gc:
period-in-ticks: 600
load-threshold: 0
我现在看到gc就脑阔疼,最近一直在看jvm的书,因为后文会提到这个玩意,不过好在这个gc很友好
先提前讲一下gc是什么,gc就是垃圾清洁工,回收你电脑内存里垃圾的东西用的,很容易理解吧
这里chunk-gc就是区块回收,设置多久回收一次未被加载的区块
先来讲period-in-ticks:
这里的单位是ticks,玩过原版的都知道1秒是20ticks,所以600就是30秒
虽然看起来半分钟很快,但是实际上还是不够快乐的,你家机子还能加快一点频率
我一般是改到400,也就是20秒
然后是load-threshold:
这里的垃圾是按斤称的,试想你家卖报纸是一张一张卖的,垃圾站不要累死了
这个功能就是告诉你的gc,一堆垃圾至少要多少斤才能被回收
按照其他地方的教程来说是300 斤 个区块才回收
但是这是针对绝大部分服务器而言的,这其中也是有特例的
比如群组服的登陆服我个人一直觉得回收区块也太蠢了,登录服就是起到单端服的主城的功能
除非你登录服能全世界跑图,不然我觉得你回收区块,再加载,再回收,再加载也太蠢了
可采用配置
chunk-gc:
period-in-ticks: 300
load-threshold: 300
______________________________
5、79-95行 ticks-per:
ticks-per:
animal-spawns: 400
monster-spawns: 1
autosave: 6000
我们先来学英文 ticks-per : 每个tick
然后来看看正文
animal-spawns: 400
这是多少ticks可以生成一个动物,很合理的设置,不用动
monster-spawns: 1
这个就比较恶俗,1ticks一个怪,一秒20只,直到刷到上限
怎么看都不像是什么正常的数值吧喂,为什么默认值会是1啊
当然,针对不同的玩法,这里设置的数值当然是不一样的
我个人给出一些建议
常见的生存服 : monster-spawns: 2或3
追求高难度的生存服 : monster-spawns: 1或2
小游戏 : monster-spawns: 3 或更高,或同时在server.properties与bukkit.yml内禁用怪物生成
GTA : 如果你不要怪物的话,同时在server.properties与bukkit.yml内禁用怪物生成
如果你要的话, monster-spawns: 2或更高
当然你要知道,生成速度越快,玩家压力越大,我们的破机子压力也变得更大了
当玩家数量较多的时候,可以考虑大幅度提升此数值,或针对bukkit.yml内spawn-limits刷怪上限进行修改
然后是autosave: 6000
我试了好多个核心,默认都是6000,但是哒哒写的是默认0,算了,不管这么多
建议6000,这个是服务器自动保存,自动执行save-all命令
现在不管是spigots还是paper,都在自动保存的效率上面优化过了
所以使用自带的自动保存绝对是政治正确 (大雾
但是不代表你不需要关注你服务器情况,有时可能也需要一些定时重启与定时保存插件
______________________________
6、论坛里绝对没有人像我这么无聊,来讲这种这么扯的东西,233
这个默认文件里是没有的,还要自己手动加上去,无路赛
你可以在settings:下面换行添加一个
world-container:
后面填一个目录的位置,填完了以后大概是这个样子的
settings:
allow-end: true
<中间省略一堆东西>
world-container: D:\极光死亡之路\服务器\test
然后你就会发现,你根目录里的世界文件没用了
去到你填写的目录位置那里,你会发现多了一个文件夹,如果你按照我这个来的话
会出来一个叫做test的文件夹,然后这个文件夹里会有3个世界文件,分别是主世界,地狱,末地
简单的说就是把你的服务器目录拆了开来而已,一般是没有什么应用价值的
但或许做端的就可以玩一下各种花样了
数据库我就不介绍如何添加了,如果有需要的话请在下方回复,看情况添加教程
[anchor=Spigot]警告[/anchor], 本页面的更新将一并移动至 6.3章 ,由于黑科技比较多,欢迎大家在本章后继续阅读6.3章,并提出建议
-_-_-_Spigot.yml-_-_-_
优化的中坚力量,不管你paper还是spigots,都有这个文件的
我看了一下 1.8和1.14区别不算大,可能有没讲全的?
我下方不止讲优化,一些难以理解的部分也会介绍一下( 紫色数字)
1、哒哒贴内26行
save-user-cache-on-stop-only: false
true: 只在stop关服的时候保存玩家数据
false: 会定时自动保存
我建议 中小型服务器无脑设置为false,不管你开的是什么玩法的服务器
但是对于 大服和 Pvp服而言,我建议你设置为true,即使你认为你服人数多,经不起全服回档的折腾
在服务器玩家人数较多的时候显然会有更多的玩家缓存,如果你在这个时候定时保存
你的CPU会耗费大量时间去处理这些数据,这就导致每次自动保存时都会有一次明显的卡顿
而经验告诉我们每次严重的卡顿都会导致玩家在后面一段时间会继续难受一会儿
而在这种情况下你就不得不使用一些插件来帮助你保存了,最好是定时重启这种
______________________________
2、哒哒帖内49行
bungeecord: false
我上文介绍BC的时候说过,在第四章下方
如果你是BC群组服的话需要将这里设置为true,并前往另一个地方设置另一个东西
如果你记不得了,麻烦回第四章下方复习一下喵?
______________________________
3、哒哒贴内61行
late-bind: true
反正设置为true就行了
如果设置为false的话,玩家可以在地图加载完就登入游戏
当一些保护插件啊,权限组插件没加载的时候,玩家可以拆地图什么的 可爱的 海螺酱: 1.14之后late-bind没有了,默认都是加载完插件再接受传入连接
______________________________
4、哒哒帖内30行
sample-count: 12
你在客户端主页面(就是mc主页面,单人模式,多人模式的那个),打开多人模式页面
然后鼠标移动到右边那个信号图标上面,会随机跳出来 {12} 个服内玩家名字(这个12就是你设置的12)
我建议你设置为0,被motd测压的时候这个是有影响的,你也不缺这个显示,基本没人用的
______________________________
5、哒哒帖内42行
user-cache-size: 1000
这里设置的是usercache.json文件的大小上限,这东西就在你服务器根目录里
默认是1000
[{"name":"Aurora5090","uuid":"a1b2cd34-e567-89f0-g12h-3i4j5k67l89m","expiresOn":"9102-02-31 23:33:33 +0800"}]
上面就是每个玩家对应的数据例子了,我不清楚有没有插件会用到
不建议中小型服务器修改,更加不要修改为0 (等于禁用)
user-cache-size是通过实现类LinkedList来保持顺序的,而从其中删除对象是一个线性时间的操作
如果你把这个设置的太大(无限),随着你玩家的增多,对于大服而言,很可能会变成延迟重灾区
对于大服而言,你可以稍微增大一下数值。对于小服而言,设置为1000够用了。
关于到底要不要禁用也有很多说法,我个人的的看法是禁用以后服务器就会强制去不断查找、计算玩家uuid
而不是从这个缓存里面拉取,所以不建议禁用
(话说我不知道有没有内置缓存啊,说错了不要捶我)
______________________________
6、哒哒贴内58行
player-shuffle: 0
这个看起来没有用,实际上对优化也是没什么用的,我只是来讲讲其功能
默认是0啦,单位是ticks,这里为0的意思也是不启用
mc服务器处理不同玩家的数据包其实是有先后顺序的,且每个玩家加入游戏时,这个处理顺序会变化
其规则是,A如果比B玩家晚加入,那么A的数据包会优先于B的数据包 被处理
尤其对于 PVP服务器而言,尤其是duel的那种,如果玩家A在搜索对手前先退出再登陆游戏
玩家A在PVP中会占优,或者说A的pvp体验在某种程度上会更加流畅一点
本选项就是在一段你设置的时间后随机修改处理顺序,来防止这种情况的发生
设置方案:
对于普通pvp服务器而言:
- 修改此值为 300 ~ 600 之间的任意值
如果你机子的性能够好,或者想要开一个世界顶尖专业的pvp服:
- 你可以修改的比 300 低,但绝对不建议低于 200 (0除外)
对于非pvp服务器而言① :
- 但你仍然可以修改此项,尤其是起床战争,空岛战争这种有pvp玩法的
- 推荐是 400 上下
对于非pvp服务器而言② :
- 但如果你是gta,监狱风云,生存服,这种本身就有点卡的,但含有pvp元素的玩法
- 推荐是 0 ,干脆不要去修改了
注意: 不难看出,开启本选项是在负优化,但spigots于paper卓越的计算性能可以弥补这点负优化,从而提升玩家体验
______________________________
7、哒哒贴内74行
timeout-time: 60
单位是喵 好趴,单位是秒,我不卖萌了
正常的描述的话应该是" 若服务器在设定的 {60} 喵内未响应,则会执行线程转储,在关闭服务器后尝试重启"
简单点的描述就是,服务器如果卡了 {60} 秒就会自动保存并重启服务器
修改到很低可以在服务器被攻击的时候保护数据不丢失,但举个例子 IO会卡主线程,所以可能会出大问题
其他原因很多,而且我甚至不是很希望你去改动这个值
所以建议就 60 ~ 30 秒之间吧
______________________________
8、哒哒贴内45行
netty-threads: 4
分配 {4} 个线程给(异步事件驱动的网络应用框架)netty来执行网络连接
极光: 讲道理,一般来说都是设置为4的吧
yys: 不不,这是开几个线程睡大觉,大服反正核心多,随便白给一点也没关系,不过不管什么服一般都不会改吧
结论:不要改,这只是科普
然后就是这个东西的代码似乎可以优化但是你们不会我也不是很会 反正可以降低不少gc频率和处理玩家事件的占用
______________________________
9、哒哒贴内64-70行
attribute:
maxHealth: ——>生命上限
max: 2048.0
movementSpeed: ——>移速上限
max: 2048.0
attackDamage: ——>伤害上限
max: 2048.0
常见问题:
各种rpg天天生命和攻击出问题,这里就是一个可能造成问题的点
______________________________
10、哒哒贴内134-139行
advancements:
disable-saving: false
disabled:
- minecraft:story/disabled
成就相关,当你把disable-saving: false 改为 true,成就系统会是1.12之前的那种
下面的disabled: 则是禁用的成就(即不可获得的成就)
表:
disabled:
- minecraft:story/root
- minecraft:nether/root
- minecraft:end/root
- minecraft:adventure/root
- minecraft:husbandry/root
- minecraft:story/shiny_gear
- minecraft:end/elytra
- minecraft:adventure/summon_iron_golem
- minecraft:husbandry/break_diamond_hoe
- minecraft:story/obtain_armor
- minecraft:nether/return_to_sender
- minecraft:adventure/sleep_in_bed
- minecraft:story/lava_bucket
- minecraft:end/dragon_breath
- minecraft:end/kill_dragon
- minecraft:adventure/kill_all_mobs
- minecraft:story/enchant_item
- minecraft:nether/all_potions
- minecraft:story/follow_ender_eye
- minecraft:husbandry/tame_an_animal
- minecraft:nether/create_beacon
- minecraft:story/deflect_arrow
- minecraft:story/iron_tools
- minecraft:adventure/totem_of_undying
- minecraft:adventure/kill_a_mob
- minecraft:adventure/adventuring_time
- minecraft:nether/brew_potion
- minecraft:husbandry/plant_seed
- minecraft:end/dragon_egg
- minecraft:adventure/sniper_duel
- minecraft:end/levitate
- minecraft:nether/create_full_beacon
- minecraft:nether/summon_wither
- minecraft:husbandry/balanced_diet
- minecraft:nether/all_effects
- minecraft:nether/fast_travel
- minecraft:nether/get_wither_skull
- minecraft:husbandry/bred_all_animals
- minecraft:story/mine_stone
- minecraft:story/enter_the_nether
- minecraft:adventure/trade
- minecraft:nether/uneasy_alliance
- minecraft:story/mine_diamond
- minecraft:story/upgrade_tools
- minecraft:nether/find_fortress
- minecraft:story/cure_zombie_villager
- minecraft:story/form_obsidian
- minecraft:end/find_end_city
- minecraft:end/enter_end_gateway
- minecraft:nether/obtain_blaze_rod
- minecraft:adventure/shoot_arrow
- minecraft:story/enter_the_end
- minecraft:husbandry/breed_an_animal
- minecraft:end/respawn_dragon
- minecraft:story/smelt_iron
|
______________________________
11、哒哒贴内104-132行
commands:
log: true
#是否会在log输出日志,log位于你根目录里,前文介绍过
tab-complete: 0
#啊 这个挺有意思的
#建议设置为 3 或者更高 或者 -1 (禁用tab补全)
#简单的说就是,你在服务器里可以用tab补全指令
#默认设置为0的时候,只要你打开对话栏,按下tab就会显示所有(已经注册过的)指令
#设置为3的时候,你至少要输入3个字母才能使用tab,不然是没有反应的
#可以有效防御tab测压
#如果你不希望玩家用tab看到你服务器指令,请设置为-1
send-namespaced: true
#不介绍了,有兴趣的自己去研究这个东西
#简单的举个例子 在你输入 /say 的时候按下tab
#指令会变成/<plugin>:<command>的格式
#也就是变成 /minecraft : say
#显然是因为高版本的指令很蠢,低版本(如1.8)的配置文件里是没有这个选项的
#下面的没什么用,无视
spam-exclusions:
- /skill
replace-commands:
- setblock
- summon
- testforblock
- tellraw
#上面的没什么用,无视
silent-commandblock-console: false
#是否将命令方块里的提示在后台也发送一遍
#对于部分服务器是很有用的,尤其是基友开服 造单机地图的那种
OK,下面到大片的优化部分了
______________________________
12、哒哒贴内174行
item-despawn-rate: 6000
简单的说是,清理地面掉落物的间隔时间,单位是ticks
所以这里6000 = 300秒(5分钟)清理一次
减少数值(也就是更快的清理掉落物),会有效提高服务器流畅度
你在配置文件里还能见到 arrow-despawn-rate: 1200
这个是箭矢消失的时间,1200就是60秒(1分钟)后消失,我后文就不说了,一样的
问:为什么加快清理频率可以减少卡顿
你要知道,掉落物是个实体,而何时清理是要被计时的
如果你稍微加快清理速度,会导致同一时间需要被计时的掉落物减少,这样就能省下资源
______________________________
13、AI/机制相关①: 哒哒贴内...太分散了
先来介绍这三个
enable-zombie-pigmen-portal-spawns: true
zombie-aggressive-towards-villager: true
nerf-spawner-mobs: false
第一个 enable-zombie-pigmen-portal-spawns: true
是否允许僵尸猪人在地狱门边上生成,显然计算这个生成是要奇怪公式的,设置为false可以肉眼不可见地优化性能
而考虑到空岛生存这种,是会有猪人塔刷金粒的,如果你要禁掉猪人塔的话,这里设置就行了
第二个 zombie-aggressive-towards-villager: true
僵尸是否会去攻击村民,显然这个比上面的麻烦多了,要计算ai,寻路,各种问题
但是的确鸡肋,因为生存服肯定要true,但是非生存服就算设置了false也没有用,因为根本没僵尸追村民
我tm喷爆
第三个 nerf-spawner-mobs: false
刷怪笼刷出来的怪物是否有ai,没有ai就不会攻击,不会动,不会交配...
虽然东西会正常掉,但是就不用计算ai了,性能开销就莫得了。但是睿智怪物的刷怪笼到底什么玩法才用得到呢:(
虽然刷怪笼刷出来的没有性能开销了,但是普通生成的还是有开销,该打人打人,该吃草吃草。
我tm喷爆
______________________________
14、AI/机制相关②: 哒哒贴内...太分散了*2
接下来是大杂烩了,大家看看就好了
[普通优化项]
merge-radius:
item: 5.0
exp: 6.0
这个是把几格内的物品/经验球合并的设置
建议 生存相关的服务器稍微调大一下数值,item: 8.0 exp: 8.0
起床战争如果发现几个点刷的货币老是会掉到虚空里去,可以考虑改小item至0.5,这样可以保证偶尔掉几个下去
[普通优化项]
chunks-per-tick: 650
只有1.9之前有此项设置,也是挺友好的
其作用是每个ticks更新 {650} 个已加载区块内作物的生长情况
反正这个数值越大,作物整体长的越快,但是你服务器会更加难受(大雾
反之同理
和原版randomTickSpeed的gamerule是异曲同工,但是可以修改到更加精细的程度
如果服务器大面积可以种田(即有地皮,或生存服),我建议稍微调低一点,否则处理量会大,然后就不流畅
你可以简单粗暴的给他除个2,或者改的更加离谱一点,但不建议改高数值
[普通优化项]
[!]clear-tick-list: false
这个屑哒哒没有介绍,我佛了,看起来能优化?
我跑去问了下spigotmc的dmck2b,回答我说这个设置的意义不大,那我们直接跳过吧
主要是我介绍不来,太乱了 (逃
[普通优化项]
mob-spawn-range: 4
没错你上文一直在看的那个,怪物在玩家身边半径为 {4} 的区块内生成
就是在这里设置的,如果你改太大会导致玩家之间的重叠区域变大,计算量大幅度提升
同时,增加这里的数值会让怪物生成的更加分散,毕竟范围大了嘛
然而,如果你减少这里的数值反而可能会导致刷怪量变少,并不会像想象中那样更加密集
这是因为有一个自带的生成机制的限制,以及"怪物区块"变少了
我后来又跑去问了下spigotmc的dmck2b,他认为设置为5以上非常蠢,会导致很要命的滞后
反正和我前面猜的差不多,计算量大幅度提升,然后就巨卡,最高不要高于 5
[惊人优化项] [垃圾 · 负优化项] 这个设置太糟糕了,我需要在6.3章内再次提到这个家伙
max-tick-time: 正常的描述: 每个任务里计算操作实体耗费的时间上限, 单位是毫秒 易懂的描述: 服务器计算一些东西的最长耗时,单位是毫秒
以上的设置是主观的最佳设置,请设置为1000以禁用它
原因: (有一点长,但是勉强还算亲民吧)
我在开头介绍tps的时候提到了 "每个ticks内服务器都会执行诸如生成小怪,加载方块,执行物理检查等工作" 在spigot的Entity Activation Range(也就是实体激活范围)的实现里 spigot看似'优化'了这一点,在每个tick里对于生物的检查里,他会跳过一些生物 但是只是单纯这样的话,线程是不安全的 你可以把页面往下移动一点,有一个错误示范晒尸,在那里 我提到了一个 '代价是游戏内的流畅感' 我不知道你会怎么看待这个问题,我认为这是客户端与服务端之间数据的问题了
我想让大家看的是 第二节 事件与事件的监听 下 '理解客户端与服务端的关系' 这个例子可能比较适合这里,但是我不能演绎,所以大家戳过去看好了
我接着说 所以spigot得从其他代码里调用一些<E>,让这个显示变得和服务端那边的一样
为了达到显示一致这一目的,spigot需要无视所有的代码才能实现所有Entity实体保持一致 而更加要命的是,这才是Entity,还有一个Tiles Entity aikar确信,随机跳过ticks里对于一些tiles的检测,这个设置会完全破坏工作机制 因为Tiles的检测的期望值是和服务器当前的TickID一致的 (译者: TickID大概是NMS+反射获取tps用的,我不懂就是了)
在spigot这样瞎搞之后,这行代码,甚至无法正常工作
以此同时,这个机制破坏了Tick Limiter; 在这种情况下,一个实体Entity甚至可能2秒都没有更新1次(获得1tick的更新)
aikar认为,正由于上述内容 spigot在这背后的想法是有非常大的缺陷的,因为Entity和Tiles是服务器肯定有的东西 spigot为了让Entity和Tiles在各种地方都能保持一致,直接在实现里无视了所有相关的逻辑代码 (译者注: 草,无视所有逻辑代码,那么线程安全真的还存在吗)
更不用说这个还会跳过玩家的ticks检测,也就是区块加载时 '加载和发送Entiy/Tile数据到客户端' 这样的事件会延迟
既然无法在这个地方优化了,让我们来看看aikar的的观点
如果Tick limitor正在你服务器里绝赞工作中,那么你会过载你自己的服务器 (狂笑 分配给服务器的负载是绝对撑不住的 你应该减少你的玩家数量,减少你的实体数量,升级你的硬件 并考虑在你的服务器上添加新的minecraft服务器来分配负载(不需要均衡负载,开bc分配负载就够了) 您的服务器应该能够在Entity Activation Range(也就是实体激活范围)为您提供的50 ms 以下( 即保持20 TPS ) 这是跳过实体ticks计时的一种安全形式 禁用此功能,您的实体与服务器的ticks计时将保持同步,并导致服务器内的未知状态减少.
|
其他: aikar是谁?一位高级软件工程师与企业家,是Minecraft的员工,同时也是公司Starlis LLC的老板。
错误示范晒尸(笑 max-tick-time:
tile: 50 错误示范晒尸(笑 entity: 50 错误示范晒尸(笑 正常的描述: 每个任务里计算操作实体耗费的时间上限, 单位是毫秒
易懂的描述: 服务器计算一些东西的最长耗时,单位是毫秒
tile可简单理解为带blockdata的方块,尤其是容器,头颅(皮肤)这种
entity译为实体。展示框,船,掉落物也是属于这一块的
Spigots官方测试数据:
tile适合设置为 10 ~ 20 之间
entity适合设置为 20 ~ 25 之间
关于数据比其他教程里的高:
诚然,在上方基础上再次降低他们仍然可以大大提高服务器性能,但古尔丹,代价是什么?
代价是游戏内的流畅感,在玩家的视线里,尤其是entity实体这块,移动时会有显示上的延迟
看起来不是玩家在卡,而是怪物的延迟高在卡,虽然本质上他们根本就都不卡
当然,你也可以自己去试一下,也不要盲信我们测试出来的结论 |
[惊人优化项]
view-distance: 10
是的,你家server.properties下面也有这个东西view-distance=10
两个要一起食用才最好吃 (大雾
这个是视距,也就是玩家最远可以看到哪里,即使客户端开到了11区块,你也只能看到半径为10区块内的地区
但是但是,你仔细想想看,半径10,直径20,那就是每个玩家站在原地都会加载20x20=400区块
所以这个必须改一下
生存: 需要跑图,所以建议视距 5 ~ 6 的样子
Pvp: 建议 12,上限 15
小游戏: 建议 8 ~ 12
GTA: 建议 12,上限 15
备注: 如果你服务器有地皮,不论什么玩法,我强烈建议改成小于等于 8 的值,推荐改成 6
请再次注意,你家server.properties下面也有这个东西view-distance=10,要一起改的!!!
[惊人优化项]
entity-activation-range:
animals: 32
monsters: 32
raiders: 48
misc: 16
tick-inactive-villagers: true
玩家 {} 格范围内的 动物animals/怪物monsters/劫掠者raiders/掉落物misc 才会被加载
在范围外的实体将不被计算寻路,AI,等等,能有效减少服务器卡顿
一般而言建议将misc: 16 ——>降低至 5 以下,这样只有捡的时候才会加载,且基本不影响物品在水流里的速度
以及可以考虑将animals: 32 ——>降低至 20以下
monsters就仁者见仁,智者见智了,根据你服务器实际需求来修改,当然也可以不修改
[天天和上面搞混的优化项]
entity-tracking-range:
players: 48
animals: 48
monsters: 48
misc: 32
other: 64
这个是用来控制玩家可见范围的
玩家 {} 格范围内的 玩家players/动物animals/怪物monsters/掉落物misc 才能被看到
这里的other: 64指其他未能位列其中的实体的上限
千万不要搞混,设置反了,我一般不建议修改此项,他和上面的比,没有什么实质性的优化
推荐Pvp服务器 增大 players: 48 ——> 60
对于生存服而言 降低 animals: 48 ——> 32,降低monsters: 48 ——> 32
希望您能认识到,本设置的最大受益者是玩家,而非服务器的机子
[罕见的优化项]
只有1.7.10和1.8和1.9有这个玩意
max-bulk-chunks: 10
众所周知,你游戏和服务器之间的通讯可以简单地视作数据包发来发去,像抛绣球一样 (大雾
而这里的设置就是,一个数据包里塞多少个区块的数据
一般来说是不要动的......不要动!举起双手喵!
[普通优化项]
random-light-updates
随机更新区块光照,或者说,随机简单的更新区块光照,默认是false
从1.7开始还会在区块加载的时候更新光照,去看wiki还能知道是在第一个tick内进行的更新光照
如果你的地皮用了什么奇怪的模板,比如有天桥的那种,就建议设置为false,否则真的头疼
[普通优化项,你不修改会要你命的那种]
max-entity-collisions: 8
请注意,1.14我只在paper.yml里找到了这个,也就是如果你是spigots的话,可能无法设置这个
这里是设置每秒最多可以处理每个实体 {8} 次实体碰撞
低版本基本是没这茬的,但是到了高版本以后就很要命,建议设置为0,直接禁用
[ 红石优化项]
ticks-per:
hopper-transfer: 8
hopper-check: 1
如果你希望你服务器的漏斗传送的巨快,一秒20个的那种,可以把hopper-transfer: 修改为1
但是我非常不建议你这么改,除非你的服务器比较特殊,比如是minez那种(虽然你们可能也不了解minez怎么工作的
当你服务器漏斗比较多的时候,可以将hopper-check和hopper-transfer都改为10
优化的原理是下面的那个hopper-check,默认是每秒检测20次
如果发现漏斗里有物品就会看看有没有东西连接漏斗,好把物品传走
当你大幅度提高hopper-check后也会间接地减慢运输效率,但的确可以高效地缓解漏斗卡服的情况
原版速度配置: 极 端情况下配置:
ticks-per: ticks-per:
hopper-transfer: 8 hopper-transfer: 10 ~ 12
hopper-check: 8 hopper-check: 10 ~ 12
[anchor=Paper]警告[/anchor], 本页面的更新将一并移动至 6.3章 ,由于黑科技比较多,欢迎大家在本章后继续阅读6.3章,并提出建议 -_-_-_Paper.yml-_-_-_
关于网传猫端性能比paper好的言论,我测试下来paper甩开猫端不知道几条街
实际情况的话 欢迎大家自己私下去进行测试,我的结果仅供参考(?)
以及请记住一条准则,不管发生什么情况,都一定要 在虚拟机上测试
不过这和我们在这里优化服务器又有什么关系呢?
我们也只是简单的选择一个更有优势的不是么,毕竟这里是教程,也不是什么诸葛村夫大战王司徒
所以不聊这些东西了,步入教程
我刚刚去spigotmc看了下frash23的优化教程,总的来说,讲的很不错
然后我我发现哒哒有个文章也是翻译frash23的,但是翻译的太烂了233
原贴是在这里 https://www.spigotmc.org/threads ... -performance.21726/
我来帮忙重新汉化一下吧,但是里面会有我自己的观点和看法
1、optimize-explosions
默认是 false 建议改成 true
开启后会使用另外一种优化后的爆炸算法,会立刻清除被炸死的实体
原理是 通过在爆炸期间实现缓存玩家实体并查找实体,取代了在爆炸期间重新计算
反正能优化就行了,服主们哪管那么多,原理看看就过去了 :(
______________________________
2、mob-spawner-tick-rate [哒哒把这块直接翻译错了,大概是战术防盗]
默认是 1 建议改成 2 ~ 15
刷怪笼每次计算"怪物区域"并尝试生成怪物之间需要间隔多少ticks
设置为2的时候体验上和原版差不多. 如果服务器刷怪笼较多,适当增大他们会是一个比较不错的选择
一般来说生存服设置在 2 ~ 10 之间就足够了,而且 10 已经很离谱了
但是比较有意思的是,某些服务器甚至会卖刷怪笼,而且有些是很容易获得的(我还真见过有5000个刷怪笼的服务器)
所以给了一个很 极端的 15
______________________________
3、disable-chest-cat-detection
默认是 false 建议修改为 true
如果有猫坐在箱子上,你是打不开箱子的,除非你把这里改成 true ... (真的好蠢啊XD)
设置为true可以让生存服、或有地皮的服务器提高一点性能
优化原理是打开箱子时会检测有没有猫,因为地皮和生存服一直会有人开箱子,如果是false的话,就会一直检测 喵喵彩虹猫
设置为true就是关闭了
再注 : 有人问我为什么 "true是关闭,而false是开启"
来学习一下英文 disable-chest-cat-detection : 禁用箱子上的 喵喵彩虹猫(和风版)检测
true可以看做是启用,那么 启用"禁止检测" 功能,那么不就是禁止检测么
______________________________
4、use-hopper-check
默认是 false 建议改成 true
1.9以前是有的,建议启用,上面spigots.yml里也有提到
paper在效率上优化的很好
然后我们顺便来看看其他的漏斗优化项
hopper:
push-based: false
cooldown-when-full: true
disable-move-event: false
1.9以前没有这堆东西,而1.14似乎出于对性能的考虑删掉了push-based
简单讲一下吧
push-based: false
不建议开启,会导致性能降低与一些bug出现,设置为true后,物品会把自己推入附近的漏斗,而不是漏斗吸物品
或许不是很好理解,物品把自己推入漏斗意思是所有掉落物都会自发的寻找漏斗,显然漏斗会比掉落物更少
所以让漏斗来寻找掉落物似乎是一个比较好的选择。除非你服务器比较特殊,否则建议保持 false
cooldown-when-full: true
当漏斗满了以后,会暂时让漏斗休息一下,而不是继续去寻找边上的掉落物
建议设置为 true
disable-move-event: false
设置为 true 可以显著提升生存类服务器的性能
但是会导致所有监听漏斗 InventoryMoveItemEvent的插件暴毙,即使这样的插件数量不会很多
______________________________
5、container-update-tick-rate
默认是 1 建议改成 2 - 3
背包与箱子的gui多少ticks会刷新一次,设置高于5会导致物品消失等破水事
______________________________
6、queue-light-updates
默认是 false 建议改成 true
开启异步光照队列有助于提高服务器性能
简单的说就是 你服务器要更新A和B两处光线,目标是现在更新A,更新完就更新B。但是你服务器正在算别的东西
如果你按照目标执行,会导致服务器的瞬间卡顿。但开启本选项后,服务器就会在不那么忙的时候再更新光照
深入了解下去就会知道是在每ticks结束的时候尝试光线更新的
______________________________
7、fire-physics-event-for-redstone
默认是 true 建议改成 false
默认(true)状态下,服务器  红石在激活状态下会触发BlockPhysicsEvent事件
有一部分的插件会监听BlockPhysicsEvent事件,然而他们并不会想要顺便监听一下  红石
所以这个功能开着就是白瞎的,还浪费性能
考虑到生存服里每秒可能会调用几千次BlockPhysicsEvent,所以我觉得还是关掉比较好
如果你的生存服比较卡,赶紧来看看这里是否false了
______________________________
8、grass-spread-tick-rate
默认是 1 建议改成 2 ~ 4
草方块蔓延速度,单位是ticks
对于 普通生存服 而言,建议 4,如果你的服务器性能够好,可以设置为 2
对于 空岛生存 等 而言,建议设置为默认的 1,因为没有那么多草方块可以给你长
对于 有地皮的服 而言,建议修改为 3 ~ 4,除非你的地皮不是默认草方块的那种(我还真的在国外服务器见过)
至此,哒哒贴内(或者说是frash23帖内)介绍的优化项就已经分析完了
我加了一些原理 和自己对于不同服务器的配置建议
接下来的也是挺有趣的,我也会在最后告诉大家单纯修改这三个配置文件可以实现什么玩法
但是剩下来的部分会根据版本的不同有所缺失
我大致去查看了一下 config-version: 9 ~ 19 (1.8-1.14)的配置文件
______________________________
9、enable-player-collisions: true
是否允许玩家之间的碰撞体碰撞,默认是true
但是如果你看了spigots.yml的介绍,就会知道我非常建议你设置为 false
______________________________
10、save-player-data: true
前面的那个优化不怎么样,但是paper的优化非常棒
所以我建议你打开这个
______________________________
11、despawn-ranges:
soft: 32
hard: 128
当任何实体离开玩家 {32} 格远时,他们会随机消失一部分
当任何实体离开玩家 {128} 格远时,他们会全部消失
生存服 建议: soft: 32 hard: 96
附:
16 = 4区块 32 = 16区块
48 = 36区块 64 = 64区块
80 = 100区块 96 = 144区块
112 = 196区块 128 = 256区块
______________________________
12、bungee-online-mode: true
1.8没有,似乎是1.9开始才有的
首先引入眼帘的是online-mode,所以盗版服务器请设置为 false
我也不知道这个到底是怎么操作的,反正会匹配一下bungee和代理proxy服务器的online-mode就是了
______________________________
13、cache-chunk-maps: true
1.9以后似乎就没有了
对服务器的 ChunkMap进行缓存,可以设置为true来提高一点性能
我知道有rpg服务器是1.8或者更低的,所以跑跑副本什么的动不动就加载&卸载区块,提升还算是明显(肉眼可见)
______________________________
14、其它优化项与设置,下面的会非常有趣,可以做到很多奇怪的玩法
首先是这两个
keep-spawn-loaded-range: 10
keep-spawn-loaded: true
让出生点附近的区块保持常载,上面的那个是半径,下面的是是否开启
我觉得你家机子要是不能保证出生点区块常载也太弱了趴
建议保持开启,但你可以适当减小半径,但我推荐登录服不要修改此项
然后是
parrots-are-unaffected-by-player-movement: false
是否让鹦鹉黏在玩家肩上,设置为true可以减少ai的计算,肉眼不可见地优化着服务器
接着是
game-mechanics:
shield-blocking-delay: 5
你制杖吗?不,我持盾。
你举起盾牌前会有 {5} ticks延迟,你可以加大,但绝不能减小,这是游戏体验与性能双收的配置
disable-unloaded-chunk-enderpearl-exploit: true
当设置为true,末影珍珠在被丢出去的过程中不会加载沿途区块,生存服或许会优化一点的样子
disable-chest-cat-detection: false
上面提到了,检测箱子上的 喵喵彩虹猫用的
disable-player-crits: false
设置为true后玩家就不能暴击了
disable-end-credits: false
你在死亡时会看到一个分数,而显示这个分数某种程度上会让数据包变大那么一丢丢
设置为true后可以肉眼不可见地优化着服务器,当然如果你只是单纯不想看到这个分数也可以设置
disable-sprint-interruption-on-attack: false
设置为true后甚至可以在A玩家攻击时取消A玩家的疾跑,正常服务器没有需求,但可以做一个诡异的玩法
然后看一点其他有趣的东西
disable-explosion-knockback: false
设置为true后,爆炸不会击退任何生物,优化是基本没优化,但是可能有玩法用得到
allow-leashing-undead-horse: false
设置为true后,玩家可以用缰绳拴住骷髅马和僵尸马
stackable-buckets:
lava: false
water: false
milk: false
设置为true以后,对应的岩浆/水/牛奶桶就可以堆叠了
fishing-time-range:
MinimumTicks: 100
MaximumTicks: 900
在没有附魔的情况下,钓鱼时长最短是100ticks(5秒),最长是900ticks(45秒)
这里的时间是能看到有鱼游过来,至于有没有钓上来 或者 钓了什么又是另外一回事了
你可以设置的巨长,或者巨短,也可以有新的玩法体验
警告, 本页面的更新将一并移动至 6.3章 ,由于黑科技比较多,欢迎大家在本章后继续阅读6.3章,并提出建议
至此 4.1 对 服务器 从配置文件上 进行优化
就结束了!!!!
让我们来讲一些理论角度出发的 ,且从本人视角出发,很主观的一个介绍
4.2 对 服务器插件 从数量,配置上进行优化
4.4 从 服主心理 开始分析 让你深刻体会 哪些事有必要做 哪些事完全无意义
4.5 从 玩家心理 开始分析 为什么服主要做这些事 为什么有些内容无意义
Tips1: 请不要用预制端,你要是真的想用,请你找一个质量高一点的
你喜欢插件多还是少?
这个问题比较蠢,因为玩法如果要丰富的话,势必会导致插件数量变多
但是实际上不动脑子也知道,插件加的越多,服务器计算量就会增大,自然也会卡
所以到底如何取舍就成为了一个大问题
你或许见过一些付费端会超过一百个插件,看起来光鲜亮丽的外表下,其实是端作者过于睿智的体现
或许宣传图很炫酷,或许特效很棒,或许玩法也很棒,但是你觉得你机子带的动吗
————————————
奇怪的质问1: "机子不够好是你们自己的问题,关我们做端的什么事?"
极光无奈的回答道 :"诚然如此,但你很轻松就可以优化得更好,而你没有做到,所以我说你的端质量低下没有问题"
奇怪的质问2 : "爱买不买是别人的事,你不喜欢是你的事,别人就不一样了,闭嘴,滚!"
极光无奈地回答道 : "所以我来这里喷你们这些卖端的了"
奇怪的质问3 : "听见没有,**,给我滚啊。别人爱买不买,没人像你一样追求优化,管你p事啊艹 "
极光高兴地回答道 : "激动什么嘛喵,你的端既然都卖了,质量这么低,我觉得这端要么免费,要么就不要发出来丢脸了"
————————————
诚然,这些端有些地方做的确有过人之处,但是就是这所谓的过人之处弄烂了这个端
过量的插件,无处不在的effect效果,各种技能,particle粒子,以及没有优化过的配置文件
只要玩家数量上去了,这种端下玩家的体验绝对是巨烂的
这就是纯粹在 "堆叠_配置文件",而非 "配置_配置文件"
几乎80%的付费端都是如此,而免费端质量更是参差不齐,不过mcbbs这里有敲原创图章的端还是相对不错的
国内的免费端发布 我觉得只有mcbbs里的端是能正视的
国内的付费端市场简直就是 脏 乱 差 无人监管 自成一体 的人间之屑体系
我绝对不建议购买任何国内的付费端,99%都很糟糕,且骗子不少,虽然我这番言论可能会误伤极少数优秀的付费端作者
更不要前往国内任何所谓交易平台进行购买,他们表面光鲜亮丽,背后里实则是黑市交易
他们也是前面提到的利益链的一份子,更是国内插件倒卖的巨头
[查看网页源代码可以看到mc这块国内外的枪毙名单]: 如果想在名单中除名,请去举报版举报我,然后我会把你们的证据贴在你们脸上
①我的世界交易网 国内付费插件倒卖最大市场 站主: 夏君游 (UID: 2546903) 网站 https://mc5173.com/forum.php
②绿龙头 国内最大的破解付费插件市场,由于性质特殊,网址就不放出来了
③黑龙头 全球最大的破解付费插件市场,性质特殊
④我记不得叫什么云黑了,反正是和卖垃圾端&倒卖付费插件&d服&恶意竞争市场 有密切关系的
另注: 我不想一棍子打死,但是不管是云黑里都没有什么真正的好人,要是真的有好人 他们举报自己云黑比我举报方便多了,哪里还用得着我来说
如果你要购买付费端,我唯一的建议是前往国外的 MC-market 进行购买
物廉价美,之前和朋友买了70个端来测试,优化都非常不错,且很多玩法在国内是稀缺的,基本见不到
价格在15美元朝上的基本都有几个原创插件,地图都是原创的
就算不是原创的地图也都有授权,所以其实mcbbs的版规已经很松很松了,别再吐槽了
MC-market 也卖配置,其中不乏卖mm配置的这种,几美元就可以买到几千行的超恐怖mm技能和怪物
没错是几千行,实打实的几千行。我印象最深刻的一次是,花3美元买了个长度高达6000行的技能
用来学习mm,skillapi,量子/非凡,等等RPG相关的插件都是非常好的主意,当然你也可以直接用
不管是端还是配置都是包更新的,唯一的缺点是,你要会英文才能和作者沟通问题
丑话说在前面,配置我全都买了,所以谁要是想以原创发在mcbbs里会被我立刻击毙的
我和很多国外端作者挺熟的,谁要是敢倒卖,脑袋都会掉下来的
|
其实现在想想,快餐服多,可能 仅在某种程度上也是一个错觉
不如说是用低质量端的服务器和快餐服区别不大,再加上国内玩法的单一化
那些技术不够的服主会被我们误判为快餐服
在第六章( 团队 ) 里的行情统计,我们在统计时的确发现了大量低质量服务器
但是在统计时,判断是否为快餐服是有其他标准的,所以很多服务器并没有被列入其中
而当我们仔细考量低质量服务器端时,不难发现
[优化差] [使用相似同类端的服务器多,视觉疲劳,玩法也单一] [玩家体验差] [各处有可供盈利的项目]
所以我们所谓"快餐横行",其实是在说 " 国内MC服务器质量普遍位于中低档的低谷中"
当然不可否认的是,快餐服都用端,而用端的服务器质量也必然低
很容易就能得出这个结论
但凡服主有能力做的更好,他可以选择优化这个端,也可以选择自己原创一个端,即使玩法仍然是单一的
而快餐服用端是最赚的,如果你看过我的文章 我国mc为何没落 ,或许就能对我的观点有更深刻的认识
而用端的另一个弊端是 极度不便
如果你用过端,我认为很多人应该都深有体会
- 莫名其妙就出来的报错
- 永远找不到的插件
- 熟悉这个端、上手耗费太长时间 -> 难以修改配置,难以做出更大的改动
- 不知道藏在哪里的后门
这也导致了一堆服主不愿意动手去修改,于是懒癌发作,导致服务器快餐服病毒的检测结果从阴性变成了阳性
所以用低质量端,甚至是用端,都不是一件什么好事
我认为最棒的就是从头自己开始弄,毕竟就算你是100%的萌新
到现在你已经学会了 : 各种配置,如何更好地优化自己的服务器
接下来我还会教 地皮以及多世界以及NCP反作弊 的配置与优化注意事项
当然也有一个worldedit的笔刷教程,所以用端感觉没什么大必要,但你仍然可以用质量高一点的端
只要你不嫌弃上面列出的那4个问题
重复结论1: 请不要用预制端,你要是真的想用,请你找一个质量高一点的
Tips2: 提心吊胆,委曲求全,插件越少越好
是的,我不是想教你到底怎么选择插件,因为这深究起来比较杂烦
我只是想让你知道,插件的确是越少越好的。当然,你说你想多装几个 大家认可的优化插件,这当然可以。
1 如何 "提心吊胆"
首先,你的插件最好是在 Bukkit/SpigotMC/MCBBS 论坛内下载的,这样能有效避免后门
其次,请不要使用任何 "破解的付费插件" ,尤其是黑龙头和绿龙头这种地方,可能会有后门
再次,国内买的付费端很多都有后门,所以即使是付费端也要额外注意
最后,提防后门只是第一步,我绝对不是不想单纯的讲这种东西
你还需要在 玩家想法 和 服主想法 上提心吊胆
何为玩家想法,他们喜不喜欢这个插件,喜不喜欢这个玩法,才是你开服的本质与本职
的确,我的说辞是很空洞的,且各种教程里也千篇一律,说法没有问题,但是很空虚,新人伸出手却捉不到答案
"怎么判断玩家喜不喜欢,如何去琢磨?服主的本质与本职又是什么?"
但是不知道你有没有发现,我的这篇教程里到处都是转折
玩家喜不喜欢一个玩法,无非是简单的换位思考
当你作为玩家在各种手游,端游,网游,页游,3A大作里,或者和渣渣辉一起攻沙的时候,心里想的是什么?
诚然,可能是热血,科幻,感动,温馨,平静,治愈, nekopara??? 等等
但回归本质,玩家无非是在想:
- 这个插件它好不好玩?
- 它的核心玩法可玩性高不高?
- 这个插件能让我们体验到什么新东西?
不错,不管是某个玩法的核心插件,还是某个附属插件,又或是优化插件
他们都能让游戏焕发出新的内容
而你成为 追求剧情,追求难度,但同时也 追求舒适,追求无脑 的不同服务器玩家去看待问题就会简单的多
小结 : 先做好简单的换位思考就可以了,尤其是第一次做 ......这种事情的,不力求完美,只希望大家能想到这点
想要做好服务器,也要多玩各种其他游戏,不管是手游还是pc端的独立游戏,至少阅历要够
而 服主想法 相较之下简单多了!
你无非就是想做好服务器而已,虽然这会让你不断加新的插件成为服务器累赘,但你喜不喜欢也是一件大事
你是游戏管理者,你可以听取玩家想法,更可以不听取,在一些玩法的原则上,不能打破就是不能,不能更新就是不能
当你拿到一个 玩法类插件(插件可以简单分为 : 优化类,玩法类,功能类)
建议的反应流程
你的第一反应建议是 : 会不会对玩家体验造成负面影响
你的第二反应建议是 : 会不会对玩法造成影响,如果改变了玩法的话,玩家喜欢吗
你的第三反应建议是 : 如果没有负面影响,玩家也喜欢,你是否要坚持你的玩法呢
或者说,你到底希不希望玩法改变呢
2 如何 "委曲求全"
堵上全部武装、战力、战术 开始求饶!
——《游戏人生: zero》 休比
显然委曲求全也是一门学问,而且是一门大学问
上面我们提到 "当你想要装玩法类插件时,你的第一反应是,会不会对玩家体验造成负面影响"
但是负面影响也是分为多种的,比如你提升了游戏难度,修改配方提升合成难度,这是一种
但第一种是要留给玩家和服主评判的,我们这里只提第二种,"流畅度"
服务器卡了玩家体验当然差,不要问我为什么,这没什么好问的
而你唯一能减少卡顿的只有两个地方,要么不装插件,要么把插件配置优化的好一点
但是大部分插件做不到后者,而能做到的插件,又需要使用者对插件有足够的了解,新人而言有点难
所以我就得出了一个对于新人而言,非常简单,粗暴,且高效的方法
在服务器基础玩法已经形成,且完善的前提下,我们按照 "建议的反应流程" 先进行考虑
一旦其中有任何一项不满足条件,或者这是一个 功能类插件
我们就步入这个步骤2 "到底装不装插件",开始思考其必要性。
对于 功能类插件,这个问题是很简单的,你只要把你所有插件的配置文件翻一遍即可
什么?你说这在开玩笑?不我没有在开玩笑
— 你想安装tplogin插件让玩家登录时的地点固定?
当你看完ESS的配置文件,就会发现完全可以设置,压根不用装插件
— 你想给服务器的玩家前/后缀称号?
当你看完GroupManger或者LuckPerms的配置文件,就会发现称号插件不是必要的
当然有一些称号插件是挺方便的,至于到底需不需要就是你来判断了
- Bukkit系 : FreeSwitchTitle —— 可自由切换称号的称号系统
- Sponge系 : NewHonor —— 多功能的头衔称号插件
— 你想让玩家自己创建商店?
实际上shopkeepers,chestshops,等等插件都可以做到,仔细找找看?
— 你想禁止自然回血,固定时间?
/gamerule 请你去玩玩原版,然后就知道到底应该怎么整了
— 你想修改药水效果,破坏速度,移动速度,液体流动速度,自然建筑生成,群系是否生成,群系大小?
一切尽在 spigots.yml 和 paper.yml
你甚至还可以修改是否生成矿洞/峡谷/地牢/神殿/基岩/村庄/废弃矿坑/等,关闭雷暴,修改结冰与积雪速度
修改移动/跳跃/疾跑/跑跳/攻击/游泳/自然回血消耗的饥饿度,各种作物包括地狱疣的生长速度,甘蔗和仙人掌高度
还可以防高空流水/岩浆,防tnt崩服,等等等等
还自带 远超任何插件效率的防矿透anti-xray,非常建议生存服开启,但是在哪里都得自己找
所以你只需要委屈一下自己,看看有没有办法利用手头的实现相同的功能
然后仔细想一下,这个到底会对 "建议的反应流程" 里的内容冲突多少
当然,最后做出抉择的是你自己
ps: 像什么yum,plugman,还是什么itemeditor,editlore等插件,虽然玩家不会用到这些插件
但是他们仍然会有占用,如果你的服务器真的已经99%完善了,非常建议删掉,或者通过修改文件后缀名禁止加载
对于 玩法类插件,这个问题是很恐怖的,这几乎是所有新人的盲区
什么?你说这在开玩笑?不我没有在开玩笑
首先你要对玩法足够熟悉,否则我觉得你只要按照 "建议的反应流程" 来就行了
对于足够熟悉的人来说,玩家的喜好你也清楚了,也不用看本帖了
没错就是这么两极分化,非常极 端
是否安装这个插件仍然是服主自己的选择
如果认为安装后服务器流畅度仍然令人满意,且玩法饱受玩家喜爱,那么自然可以安装/保留插件
而如果一个插件需要你在流畅度与玩法直接进行抉择,这又是仁者见仁智者见智的情况了,望谨慎选择
当然,你大可直接装上去,要是太卡,或者玩家反响太差就删掉
这是很多服务器选择的做法,我不提倡,也不喜欢,但这种做法的确可以帮你看到玩家的反馈
3 插件越少越好
恭喜,这是一个结论,而让插件变少的方法就在上面 "1.提心吊胆" , "2.委曲求全" 里
而你已经 简单的 了解了如何减少你服务器运算,提高运算速度的最简单、粗暴的方法
这个方法就是 "插件装的越少越好"
而根据上文的顺序来思考,可以保证你每个插件、每个已有的配置文件可以被最大限度的利用
这无疑是非常棒的优化手段,虽然其简单、粗暴,但是可以说: 结果是非常优越,令人满意的
下面的内容是这三个
4.3 对 jvm调参 从最基础的初步认识开始 进行优化
4.4 从 服主心理 开始分析 让你深刻体会 哪些事有必要做 哪些事完全无意义
4.5 从 玩家心理 开始分析 为什么服主要做这些事 为什么有些内容无意义
[anchor=JVM]完蛋,最头痛的jvm来了[/anchor]
一般来说是要加参数然后根据gc打印的log来优化,每个服务器都不同的
然而这个jvm被mc的垃圾代码限制了一下,所以似乎单纯优化内存感觉就足够了X
难度急剧下降
然后我发现哒哒为又双叒叕有一个帖子
而且又双叒叕是搬运过来的 Aikar: 调整JVM —— 非常有效的服务器启动参数
虽然翻译的一般,但是内容的确比我好,所以我就不讲了吧
当然,这贴也不错 冥想了一夜的服务器启动参数
这次是真的不讲下去了,因为我实在是太菜了,非常建议大家去看一下上面的这两帖
以我的水平只能来讲讲一些基础知识
我是一个纯度90%的真·新人,如有错误,谬误,纰漏,错字受,欢迎指出
下段的目的是帮助服主读懂其他含有专业名词的教程
你也许看过什么jvm优化贴,你也见过其他优化贴,但毕竟很多萌新完全看不懂里面的专有名词
如果你希望稍微能对jvm优化mc内存有一些了解,你可以继续看下去
对于不敲代码,连"ram"都听不懂,更别提"吞吐量""GC"的人,本帖可能会有所帮助
最基础:
RAM是什么?它是电脑内存,或者说是运行内存
你租机子的时候看到的 4G,8G 都是这个玩意
同时,如果你看了上面几个帖子,你就会知道要在bat里面通过jvm来分配一下内存
-Xms最小G -Xmx最大G 至于这里到底应该怎么分配,我们下文再说
新人会有疑问的是,我们看到的另外一个叫做硬盘的东西 ,也有40G,80G,这个是什么?
他是 ROM,也就是你家电脑里存数据用的东西
比如说你下载了一个游戏,下载了一部电影,下载了一个galgame,下载了一个软件,下载了一堆 H图
他们的大小都是巨大无比的,就连你的服务器核心也是 20~40MB。然而同样,你硬盘的容量也是巨大无比的
这里来科普一下机械硬盘(HHD)和固态硬盘(SSD)的区别
如果你租服的时候遇到了 ...... 这只能说明你遇到了这种破水事而已
本帖最后更新日期是2019年,反正过个几年这里的数据就完全过时了
机械硬盘的读写速度是100~220M每秒,最顶级的也不过220M/s上下
固态硬盘不同品牌型号之间,差距非常大,区间在150~600M每秒
消费级的(你能买的,或者是你能租服时见到的)两种硬盘之间的区别大概撑死是3倍的样子
不错,固态硬盘的读写速度的确是比机械硬盘高不少
即使你不使用mysql数据库存插件数据,只使用默认的.yml存,中小服使用固态硬盘甚至可以做到媲美存数据库的速度
在数据保存时也有非常优秀的表现,可以有效保证游戏内不会出现过分的波动,但该在峰值卡顿的还是会卡
某种程度上也能够稍微拯救一下小服的TPS
但是,固态硬盘贵啊,贵啊," 贵啊",虽然现在是有各种消费级的固态硬盘,价格亲民了很多
但是读写速度是会随着使用时间变长而下降30%左右的啊,而且如果一旦出现损坏,几乎无法恢复数据
所以备份是有必要的 (我好像在前面哪章节里一直重复这话?好像真的是这样草绳)
但是...也就看看就过去了,除非独立机,不然不要纠结这种东西
你就单纯租个vps,而且开服这种事很降设备寿命的。你真觉得给你的固态硬盘能有多好?
一般是用简写的,我这里为了让你看懂所以没用简写,机械硬盘 = HHD 固态硬盘 = SSD
稍基础:
并行:
| 哦豁,完蛋,纯萌新看到这个词就懵了,但是其实根本没什么难理解的
| 意思大抵是 " 同时做多件事"
| 我在 写作业 时挂机 刷明日方舟夏活蓝火之心OF-6副本
| 这就是最简单的并行了,你的cpu可以同时做多件事,处理多个事件,这就是并行
| 注意: 单核cpu的无法并行,只能并发(虽然这对理解毫无帮助甚至还会让你更加迷惑但是我就是想说你能打我吗喵)
|
并发:
| 我在 写作业 时发现我副本自动代理完一次了,于是我要停下写作业, 重新去开一次副本,然后再 写作业
| 很明显,我的操作是 " 写作业 -> (停下写作业)重新开副本代理 -> 写作业"
| 这就是并发,即使我只能在 刷副本和 写作业之间的状态里 切换来切换去
| 而在现实中,我们会和同学说 "我 一边打游戏 一边写作业",虽然你是"并发",但你描述的是"并行"
| 不是说这么描述有问题,而是这就是为什么会有人搞混"并行"和"并发"的原因之一
|
| 我们只有一个身体: 只可以通过 交替来达成做几件事,这也等于说明 "单核cpu可以并发,但不能并行"
| 但当你可以操作几个身体时 : 你可以 同时做多件事,这也等于说明 "多核cpu拥有并发和并行的能力"
| 也就是并发 不追求事件同时发生
|
| 多cpu情况下,并行可以变得更加复杂,比如进程交替,重叠,也可以视作是多个并发事件同时发生变成了并行
| 但这也仅供新人了解一下,看不懂就无视&跳过,毫无影响
————————————————————————————————
同步 :
| 魔兽世界怀旧服开了!!!
| 连刷个小怪都要排队半小时?! 
| 排在后面的玩家必须等排在前面的玩家 先刷完怪才能刷
| 是的,这就是同步,你必须等前面一个事做完,才能轮到你来做
| 你必须等前面一个方法执行完毕,下一个方法才能执行,很容易理解吧
|
| 同样,你可以发现,这些进程之间是有依赖关系的
| 必须等前面一个刷完怪,他会[输出]一个"我刷完怪了,你来吧"的消息
| 收到消息以后你 才能刷,你会[输入]一个"你结束了,我来刷怪"的消息
| 这就是一个依赖关系,其判断标准可以视作"有先后顺序"
|
异步 :
| 什么?!魔兽世界怀旧服出分线系统了?!
| (分线即有不同的线路,和你贪玩蓝月登陆的时候有什么 7024号服 皇城争霸服这种)
| 你可以在不同位面,线路里刷小怪!
| 这时候就有两个或者更多的玩家,可以同时刷小怪了!
| (请注意,这两个人刷的小怪是不一样的)
| 当然,这就和上面的并发一样了,这时候就称作异步(调用)
| 如果和并行一样的情况也是可以叫做异步的
|
| 但你可以在 作业快要写完的时候 开始 刷明日方舟副本
| 也就是说其实你可以在任何时候插入另外一件事
| 如果说同步是"有先后顺序",那么异步就是完全独立的几件事
| 不管你小怪刷没刷完,都 与我另外一个服务器里小怪刷没刷完 无关,雨女无瓜,丑老太婆 (大雾
|
| 我们可以发现,同步是会'阻塞'代码执行的,我闲着在那里等着,得等前面刷完怪我才能刷
| 所以其实不管单线程还是多线程都是有异步的
|
| java异步一般是多线程啦,要自己开线程池的
| 线程是实现异步的一个方式,异步是让调用方法的主线程不需要同步等待另一个线程的完成,从而让主线程干其他事情
————————————————————————————————
Suspend/挂起 :
| 百度查一下英文,悬; 挂; 吊; 暂停; 中止; 使暂停发挥作用(或使用等); 延缓; 暂缓; 推迟
| "挂" 就是称之为 挂起 的原因,而后面的 "延迟" "暂缓" 则是挂起(Suspend)的本意
| 我们举一个例子:
| 你或许会看到 "... 会导致线程被挂起,直到..." 这种话
| 这话想表达意思的就是 "... 会导致线程暂时停止工作,直到..."
| 我们下文来一个实际的语境,就会非常容易理解了
————————————————————————————————
临界资源 :
| 打印机一次只能打印一张纸,他不能同时打印多个进程的结果
| 否则一张纸上又有英语作文又有语文作文还有数学例题,你到底交给谁看好呢
| 但是会有英语老师,语文老师,数学老师轮流使用这台打印机
| 那么这台打印机就是公共共享的资源了,我们称其为"临界资源"
| 但是一次只能给一个老师用,从来没有一堆老师同时围着一台打印机戳来戳去的,这场面太睿智了233
| 所以前面加上了"临界"两个字
| 这里要注意的是, 打印机的确是临界资源,这不是我在举例子!
| 而软件层面上的则可以是变量 数组 缓冲区 等
| 判断他们他们的标志是 "在任何时刻都仅允许一个进程/线程使用的共享资源"
|
临界区 :
| 每个进程/线程(下面全部叫线程了)中访问临界资源的那段 代码 才是叫做临界区的东西
| 由于临界资源的定义有 "同时只能有一个线程使用",所以临界区这段代码也是如此
| 就算有多段代码都有临界区,只要有一个线程进入临界区时,其他想要访问临界资源的线程就会被 挂起
| 必须等那个进入临界区的线程释放了,其他线程才能进临界区
| 这相当于加了一把锁
|
互斥 :
| 我们把线程想要进临界区但是却怼来怼去,只能干等着的情况叫做互斥
————————————————————————————————
阻塞 :
| 其实我们上面大概有提到过,在同步那里,但还有更加严重的阻塞
| 试想你的英语老师正在印全校期中考试的卷子,然后边上有一个只想印1页讲义的数学老师欲哭无泪
| 英语老师印了一个上午,数学老师等了一个上午,而且后面又来了语文老师,大家一起干等着
| 这就是阻塞的情况之一了,当线程占临界区却不挂起,后面一堆线程都在那里吃瓜,干等着
|
非阻塞 :
| 正好和上面相反,用来描述 "所有线程都正常运行,没有线程干等了几亿年"
————————————————————————————————
吞吐量:可以看做 线程用时 占 程序总用时 的比例
| 比如这个比例是80%,那么80%的时间是在正常运行程序,20%的时间是在干其他的事
| 而没有用到的比例基本都浪费在后面会介绍的垃圾清理工GC那里
| 所以吞吐量越大越好
| 而我们希望工作的时间越长越好,垃圾收集时间越短越好(但前提是要清理完全)
| 所以我们后文就会对垃圾清理工GC进行设置,让他收集的快一点
|
并发量 : 中杯奶茶一共可以容纳500ml的奶茶,这就是他的容量上限,也就是并发量
| 并发量是越多越好的,毕竟这样就能有更多的奶茶了
|
| yys和我在买混乱牌奶茶(都买的是中杯500ml少糖去冰红茶玛奇朵加奶盖双份配料珍珠换椰果)
| yys先拿到奶茶,假设他喝奶茶的速度不变,他一段时间后可以喝完这杯奶茶
| 这时我也买好了奶茶,突发奇想,想和yys一起喝这杯奶茶 于是我和yys各拿一根吸管开始嘬这杯奶茶
| 假设我们喝的速度相同且不变 一段时间后,奶茶也喝完了
| 正常来说,第一次的时间应该是第二次的两倍 奶茶的并发量是500ml 而喝奶茶速度就是性能的体现
| 你可以把性能看作我们喝的速度,也可以看作是中杯自己主动向外压出奶茶的速度
| 我俩喝的越快,奶茶的性能越猛( 这时奶茶正在被2个人喝,它相较原来会喷出2倍的奶茶。并行处理的能力就是2倍了)
| 今天混乱比较高兴,所以又送了我们一杯奶茶(大杯700ml的中糖去冰草莓西米露加奶盖双份配料)
| 如果现在凛音和灰灰也进来喝同一杯奶茶,也就是4个人,喝奶茶的时间又缩短了一倍。
| 奶茶由500ml变成了700ml,它的并发量增强了200ml,(因为奶茶最大容量变大了)
| 这时奶茶正在被4个人喝。并行处理的能力是4倍了(因为奶茶可以同时处理4个人喝奶茶了)
————————————————————————————————
其他就不说了,我不觉得我下文介绍jvm会用到其他东西
上面的介绍很大一部分都是科普性质,下面其实也基本用不到的
唉 ... 归根结底还是自己太菜
正文:
步入jvm调优
一般来说jvm。。。 我都不知道怎么教,无从入手,先来看看我们会见到的结构吧
对于新人来说,这结构非常不友好,所以我拆开来了,虽然你仍然看不懂,但我下面会介绍一下
╭ 方法区/Metaspace ——右边的不管了——>
首先,你家服务器 | Java栈 ╮
和插件都是.jar ——类加载器——> 分配的内存空间 | Java堆 ╯——右边的不管了——>
而里面都是.class | | Java虚拟机栈+本地方法栈 ——右边的不管了——>
| ╰
|
|
垃圾收集器
左边的什么.class,什么类加载器子系统,这都先放一边
右边不管了的什么本地方法库,接口,执行引擎,寄存器,也全部丢一边
我们只来看 "内存空间" 和 "垃圾收集器"
之前提到的RAM就是这里的内存空间
而内存空间又可以拆成4个部分,分别是 "方法区" "Java栈" "Java堆" "本地方法栈"
我们用简单易懂的语言讲一下吧
这四个东西既然是在内存下的,那么怎么看都是要储存点东西的吧
(以下内容仅供瞎看看,草草看过就算数,不仅没有干货而且还没意思)
方法区(仅供瞎看看,且已经在java8中被MetaSpace取代,这段就纯粹扫墓性质)
你可能会在各种地方见到一些说法,比如 "永久代" "永久区",至于这个"什么什么代" 的名称是怎么来的,我们稍后会说
反正 "永久代/区" 或 "非堆(内存)" 肯定就都是指这个方法区,这就是别名了喵。
(不过需要注意到的是,只有最泛用的HotSpot的jvm才存在永久区的说法)
这里储存着被加载过的每一个类的信息(名称啊,接口啊)、static变量、已经失踪的常量池等
(如果你不知道什么是"类" "static静态变量",你可以假装你自己认识,或者去百度,都不要紧的)
方法区是每个线程共享的,如果定义了太多个类的话可能会抛OutOfMemoryError(这都不重要)
不过现在大家都是 java8 所以没可能出这个java.lang.OutOfMemoryError: PermGen space报错
我们假装已经认识这个方法区了,反正后文再也用不到了
|
相关参数: (下面的两个在java8中被弃用,在java9中被删除)
-XX:PermSize 设置方法区最小值(默认16MB)
-XX:MaxPermSize 设置方法区最大值(默认64MB)
无需修改,我只是想让你知道有这个叫方法区的东西而且会有人称他为"永久代/区" 或 "非堆(内存)"
而且我们一般用不到这个玩意,这段就纯粹扫墓性质
MetaSpace元空间(仅供瞎看看)
元空间与上方的方法区是一样性质的东西
只不过元空间并不在虚拟机中,而是使用本地内存
而且这东西还活着,取代了上面的方法区
|
相关参数:
-XX:MetaspaceSize 设置元空间最小值(默认约12~20MB)
-XX:MaxMetaspaceSize 设置元空间最大值(默认约4096MB)
-XX:MinMetaspaceExpansion 设置元空间最小增长幅度(默认约330KB)
-XX:MaxMetaspaceExpansion 设置元空间最大增长幅度(默认约5MB)
-XX:MinMetaspaceFreeRatio 设置Metaspace GC后最低空闲空间比,默认情况:若低于40%则会开始增长
-XX:MaxMetasaceFreeRatio 设置Metaspace GC后最高空闲空间比,默认情况:若高于70%则会FGC开始释放空间
跳过Java虚拟机栈+本地方法栈,无视
Java栈内存 与 Java堆内存(仅供瞎看看)
栈 : 英文是 stack ,是线程私有的内存区域
堆 : 英文是 heap ,是线程共享的内存区域
Java栈内存里保存
- 基本数据类型变量
- 对象引用 <—— —— —— — ╮
Java堆内存里保存 |
这个 红色的对象会在下文出现
恭喜你!你已经看完了完全不要紧的废话!我只是怕你不认识一些知识所以就瞎聊了几句
我认为除了我对于jvm结构的讲解,其他东西还是非常非常非常亲民向的(并发,并行那些东西)
接下来我们会讲一些非常非常有意思的内容
我们和蔼可亲的GC,这是一位是工具人——垃圾清理工
本段目的: 让你能理解一些基础知识,方便你读懂论坛内外的其他帖子 但是由于我的目标人群是新人,所以不会说的很严密,严谨,详细 只是说的你们能听懂个大概,但是有一些内容我是根据前后文已经提及的内容有所调整的 所以下文不严谨
首先声明一点,你家360的那个垃圾清理,他是清理 磁盘(ROM)的垃圾
然后还要你删软件啊,删什么什么啊 233
而你可爱的GC酱要删的是 内存(RAM)里面的垃圾,这俩是不一样的!
毕竟你磁盘可能超过100G,但是中小型服务器内存只有 4G ~ 16G 的样子,32G都已经是罕见的了
而GC的全称是Garbage Collection,翻译过来就是 "垃圾收集" 的意思,就是这么简单粗暴的说
然后我们来了解一下,什么是垃圾?
第一反应,大家可能感觉都很清晰,但是仔细一想就发现事情没有那么简单
草生,居然有一堆新人不知道这里垃圾指的是什么!
垃圾指的其实是死掉的对象
...嗯?哪对对象死了?谈个恋爱还能死?什么?虚渊玄又写小说了?!快把笔抢下来!
wdnmd,想什么呐,这不是一个意思啊Kora,此对象非彼对象
你肯定会听过一些名词,至于他们应该怎么分到哪类里,等你入门java就知道了
比如 "类" "对象" "字符串" "节点" "库" "容器" "源代码"
看起来都很高大上,但是你不知道怎么分类,更不知道干什么的,所以我就放飞自我介绍了
百度一下,我们发现java是面向[对象]的语言
别的不多说,就算完全看不懂是什么意思,但是想想也知道,应该是会有一堆[对象]存在的吧
没错,你的代码里会充满各种[对象],而他们的情况也不一样
- 有些[对象]用了没几次就会被丢掉 (啊?你才是花心大萝卜,你全家都是花心大萝卜!)
- 有些[对象]一直在被用 (啊?你才是RBQ,你全家都是RBQ!)
而绝大多数都是第一种情况,没用几次就会丢掉
但是你把垃圾丢在回收站是不行的,他还是在那里,你要删掉他们
然而现在我们除了删掉垃圾,还要面临另一个问题,压根没有人会丢垃圾,他们只是随手放的而已
这时候可怜的GC就要担负起 [找出垃圾] 和 [删掉垃圾] 的职责了
我们的先辈已经设计了一套模式,是根据[对象]活了多久来判断的
而上文我们在介绍Java堆那里有一个 红色的对象
这个红色的对象,就是我们要清理的垃圾之一,而GC就是用来清理Java堆内的垃圾用的
Java栈则不需要清理,Java栈有全自动化垃圾焚化炉,读取效率高
且其中对象存活时间和大小都是确定的,Java堆的对象则都不确定
先来讲一下这个分代的想法大概是什么样子的
先开辟两块地方,一块叫做新生代,英文叫Young Generation
另一块叫老年代,英文叫Old Generation
看名字就猜得出来,这俩是通过[对象]活了多久来垃圾分类的
大小比例(默认)
而新生代又分为 新生池 (Eden pool) 80% ╮
这三块 Survival0 (S0) 10% ├ 下文讲解时并不会按这个比例来讲解
Survival0 (S1) 10% ╯
最初,我们将所有对象丢到新生池里去,现在我们有
第0年:
新生池 | survival0 | survival1 | 老年代 | 永久代 | 对象1 对象2 对象3 对象4 对象5
- | 空 | 空 | 空 | 空 |
╰──────────────────| 新生代 |─────────────────╯
=============下方第1年开始============= 请注意,实际上只有经过一次GC后, 每个对象的年龄才会(至少)增加1 ,但是为了方便你们理解
下文这里用了一个完全不正常且不对的字眼"随着时间推移"仅仅是为了方便理解, 因为几个gc在现在这个时候还没有介绍,看到下文就知道了
一开始,这5个对象都是活着的,但是随着时间的变化,这5个对象都变老了1岁 ( 由绿色变成 —>蓝色来表示)
在这段时间里,又有5个新的对象出生了
但是很不巧,"对象5"过马路时被车撞死了 (变成红色表示),这导致了现在的情况是这样的
第1年:
新生池 | survival0 | survival1 | 老年代 | 永久代 | 对象1 对象2 对象3 对象4 对象5
对象6 对象7 对象8 对象9 对象10 | 空 | 空 | 空 | 空 |
╰──────────────────| 新生代 |─────────────────╯
(这个第一年,第二年都是抽象的,只是想告诉你时间在往后走)
=============下方第2年开始=============
又坏消息是,现在新生池 (Eden pool) 已经被塞满了
这代表着如果第2年有新的对象进来,他们就没办法被塞进新生池 (Eden pool) 里了
不仅挤得要死,而且 对象5的尸体还躺在那里!
(对象死了,可以理解为 "这个对象已经没用了,不会再用这个对象了")
清理工GC出动!这次的清理工叫做 Minor GC, 他是专门清理 新生池,Survival0 (S0),Survival1 (S1) 的
他会扫掉挂掉的 对象5,然后把还活着的对象全部丢到Survival0 (S0)里
这时候,一部分对象2岁了,一部分还是1岁,当然还有新生出来的对象
第2年:
新生池 | survival0 | survival1 | 老年代 | 永久代 | 对象11 对象12 对象13 对象14
- | 对象1 对象2 对象3 对象4
对象6 对象7 对象8 对象9 对象10 | 空 | 空 | 空 |
╰──────────────────| 新生代 |─────────────────╯
=============下方第3年开始=============
坏消息是,这次校车在山区侧翻了
Survival0里面只活下来了 对象4,而新生池也只剩下 对象11 和 对象12 了
同时,又新来了6个对象
第3年
新生池 | survival0 | survival1 | 老年代 | 永久代 | 对象11 对象12 对象13 对象14 对象15
对象16 对象17 对象18 对象19 对象20
| 对象1 对象2 对象3 对象4
对象6 对象7 对象8 对象9 对象10 | 空 | 空 | 空 |
╰──────────────────| 新生代 |─────────────────╯
=============下方第4年开始=============
这个时候新生池满了,所以我们又找来了 Minor GC来扫垃圾
前面说了,这个 Minor GC (MGC) 是扫整个新生代的,所以他会把s0里的也清理一下
顺便把新生池里的对象塞到...嗯?
让我们先来看看图
第4年:
新生池 | survival0 | survival1 | 老年代 | 永久代 | 对象a 对象b
- | 空 | 对象4 对象11 对象12 对象15
对象16 对象17 对象18 对象19 对象20 | 空 | 空 |
╰──────────────────| 新生代 |─────────────────╯
没错 他没有把对象塞到s0里,他把对象塞到了s1里!
那么当下一次新生池满,触发了 Minor GC 的时候,你们觉得会怎么样呢?
首先,当然是每个对象会老一岁啦,顺便会清理掉那些已经挂掉了的对象
其次,他会把剩下来活着的对象从s1和新生池里合并到s0里去
当下下次?合并到s1去
当下下下次?合并到s0去
=============下方第15年开始=============
对象4的命比较大,他现在已经15岁了
新生池 | survival0 | survival1 | 老年代 | 永久代 | 对象150 对象151
- | 空 | 对象4 对象97 对象99 对象50 对象65
对象80 | 空 | 空 |
╰──────────────────| 新生代 |─────────────────╯
可以看到数字比较夸张,其他都是对象几十,对象几百了,他还是个位数 233
这时候,他就是一个老人了,我们会把所有15岁的对象丢到老年代里面去
无意义科普: 你可以通过XX:MaxTenuringThreshold来设置几岁的对象会被丢到老年代里去
当然也有一些特例,会导致直接进老年代,这里由于是科普性的教程,所以不说了
=============下方第16年开始=============
新生池 | survival0 | survival1 | 老年代 | 永久代 | 对象150 对象151 对象152 对象153
- | 空 | 对象97 对象99 对象50 对象65
- | 对象4 | 空 |
╰──────────────────| 新生代 |─────────────────╯
没错,这时候15岁的对象4就进入老年代了
可以试想,随着时间流逝,当老年代满了
这时候就会出现 Major GC (MGC) 或者叫 Full GC (FGC) 这个东西了,两者表达的是一个东西
这个FGC/MGC 会清理老年代和永久代里死掉的对象,但是在清理垃圾的时候
其实你系统是会有一定的暂停时间的
而MGC清理垃圾所耗费的时间会远远小于YGC
所以实际上我们更希望去避免MGC,这会导致你系统停止一段肉眼可见的时间(至少要几秒的,这段停顿也称作Stop The World)
当然玩家那边也是会受到极大的影响,你卡一下都难受死,何况几秒
而作为开服的服主,你大概是没什么好办法去干掉FGC的卡顿的
所以我们会用到一个叫做CMS与G1GC的东西
再次插入: 现在你除了CMS和G1GC的部分,应该就能多多少少看懂一点了
冥想了一夜的服务器启动参数 https://www.mcbbs.net/thread-839828-1-1.html
Aikar: 调整JVM —— 非常有效的服务器启动参数 https://www.mcbbs.net/thread-867786-1-1.html
CMS : 英文是 Concurrent Mark Sweep(并发标记清除收集器)
虽然仔细看英文与中文翻译没什么意义,而且新人又是一脸懵,但是现在你应该找得出一些关键词
比如 "并发" "收集器",以及你没见过的一个 "标记"
什么是标记?就是给对象上一个 "我活着,GC别丢我" 或者 "我凉了,GC快把我扫掉"
这显然会方便GC清理你的垃圾,毕竟垃圾分类已经完毕了,你只要扔垃圾就行了
(上海北京人民有没有感同身受,丢垃圾真的痛苦 233)
CMS适合于有足够CPU资源提供给GC线程使用的服务器。
如果你需要更短的GC停顿时间并且CPU数量充足,那么就可以使用CMS收集器了。
举个例子,如果你服务器有较多长期存活的对象,那么老年代就会很大,导致GC耗费的时间很长,那么暂停时间也就很长了
如果恰巧你服务器cpu是大于等于2核的(大家基本都符合吧),那么就可以使用CMS收集器了
如果简单理解的话,你可以这么理解CMS的流程,虽然不尽完善 :
CMS会先标记出新生代里活着的对象,然后标记出老年代里活着和死掉的对象
由于要标记的对象肯定不会少,所以这会持续很长一段时间,但是CMS和你服务器的线程是并发的关系
这会吃你服务器资源,但是CMS并不是时时刻刻都在标记对象,而且你服务器并不会怎么卡
所以CMS还是很有意思的 (我在说什么
我们从百度百科上拉一段东西下来
我知道你们看不懂,所以来看看时间好了
总之,效率还是算感人的
[GC [ParNew: 9110K->972K(9216K), 0.0056278 secs] 48708K->48702K(60416K), 0.0056664 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
【1.初始标记】会stop the world
[GC [1 CMS-initial-mark: 47730K(51200K)] 48766K(60416K), 0.0000829 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【2.并发标记】
[CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【3.并发预清理】
[CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【4.重新标记】会stop the world
[GC[YG occupancy: 1036 K (9216 K)][Rescan (parallel) , 0.0001092 secs][weak refs processing, 0.0000140 secs] [1 CMS-remark: 47730K(51200K)]
48766K(60416K), 0.0001609 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【5.并发清除】
[CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【6.并发重置】
[CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
|
我们假装看完了上面这段意义不明的东西
来讲一下CMS相关的参数吧
[当然,下面第一个是 启用CMS的时候要加上去的,打钩的是个人感觉可能有必要的]
√ -XX:+UseConcMarkSweepGC 启用CMS回收器
-XX:ConcGCThreads 设置并发线程数量
[下面的默认70%]
√ -XX:CMSInitiatingOccupancyFraction 设置当老年代使用率达到【你设置的百分比】时,执行一次CMS回收。
√ -XX:+UseCMSCompactAtFullCollection CMS在垃圾收集完成后,进行一次碎片整理。
√ -XX:CMSFullGCsBeforeCompaction 设置当进行N次CMS回收后进行一次内存压缩。
-XX:+CMSClassUnloadingEnabled 使用CMS机制回收Perm区Class数据
如果总结CMS关键词的话,应该是
1 "并发"
2 "停顿时间很短"
但是同样,CMS是有致命缺点的
1 上文我们有提到CMS会占用CPU,这会导致服务器性能降低,流畅度略有下降
2 我们可以看到上面有一个叫做"-XX:+UseCMSCompactAtFullCollection CMS在垃圾收集完成后,进行一次碎片整理。"
的参数,看起来很好,但是仔细想一下,为什么需要进行碎片整理?
答 : 因为有碎片嘛
没错,虽然我不会细说这个碎片是什么,是怎么产生的,但是你可以把他试想为玻璃碎片( 虽然这么理解完全不对)
一堆玻璃碎片摆在你面前,你不会踩过去,而是绕路,但是实际上玻璃碎片的地面上有一些地方是没有玻璃的
但是你还是绕了过去,中间那些空间就被浪费了( 虽然的确是空间被浪费了,这么理解完全不对)
请只记结论,不记过程,结论是 "中间的空间被浪费了"
所以就要清理碎片,把它们扫到一起去,但是有一个大问题,把碎片扫到簸箕里的时候,你不是并发,也不是并行
也就是说还是会有要命的停顿时间
但如果你不设置这个参数,会有大量的空间被碎片浪费,导致你GC的次数会非常非常频繁,流畅度急剧下降
3 除了上面这个'碎片',还有一个叫做"浮动垃圾"的东西,他也是垃圾,而且必须到第二次GC的时候才能被清理掉
那么我们看到上面两个帖子
冥想了一夜的服务器启动参数 https://www.mcbbs.net/thread-839828-1-1.html
这个就是用CMS的
G1 GC,全称是Garbage-First Garbage Collector
你可以通过-XX:+UseG1GC来启用G1 GC
这个玩意呢,是用来取代上面这个CMS的
因为你看到CMS虽然有优点,但是也有缺点
G1和CMS其实差不太多,也是在cpu多核情况下,也是分新生代和老年代来标记的
但是G1和CMS不同之处在于他们分类的方法有区别
CMS就简单的沿用了新生代和老年代,分别标记一下对象是不是活着,然后清理垃圾,(这很容易理解趴)
G1就在此基础上加了一步
在上文我们知道,新生代里面有个survival0和survival1,而活着的对象会在s0和s1里面跑来跑去(这点你还没忘吧)
而细究这个"跑来跑去",其实应该称作 "复制"
再加上 CMS的"先标记是否活着"+"清理对象"
就变成了G1的 "标记" + "清理" + "复制"
你可以再多去了解一下G1,会看到一个叫做 区域(region) 的东西,他和这 "三步走 " 有密切关系,我这里不多说了
G1有什么优势?
这个"标记" + "清理" + "复制"的方法也没有那么无聊,多做一步也不可能是为了好玩对吧
这是为了干掉困扰CMS的"碎片"
采用这种方法,G1就不需要怕 "内存碎片" 了
而G1也从并发变成了 "并发" + "并行"
G1适用于 : cpu核心大于等于2 (或有多个cpu), 且内存分配大于6GB的mc服务器
他可以把每次FGC的时间压到0.5秒左右
当然,另外一个帖子
Aikar: 调整JVM —— 非常有效的服务器启动参数 https://www.mcbbs.net/thread-867786-1-1.html
就是用到G1GC的
如果你想要一个优化过启动参数的bat,详细内容可以看他们的帖子
我这里不提供了,毕竟两个帖子说的都不错
电脑前的我只能大喊
CMS 能不能带 -XX:CMSScavengeBeforeRemark 一起玩 这个参数会在CMS GC之前触发一次MGC,减少 "重新标记" 的性能开销 如果你remark的耗时过长,可以考虑在bat下面添加这个参数
然后我想讲一些有意思的提问与优化
可能是综合了上面配置文件和jvm参数优化的内容
首先是 单个 服务器玩家数量
1、我相信很多服主都有过类似的问题,不管mod还是插件服的服主
一个服务器配置越好,就能带越多玩家是么?
诚然,的确是这样的,你要是把各种云的资源都汇集在一起,可能能带几万个玩家都不卡
但是,实际上还是会很卡,更可能几百个就卡起来了,因为我们上面聊到一个叫做 player-shuffle: 0 的东西
如果翻不回去就别找了,反正这个东西就是LinkedList来保持顺序的,这会导致你服务器玩家的数据包有先后的处理顺序
加入服务器时间不同的玩家会不一样流畅,而且从其中删除对象是一个线性时间的操作
这就是为什么玩家较多的时候,有人加入/退出游戏的时候服务器可能会卡一下,而且退出的时候会有更要命的卡顿
更何况由于数据包有先后的处理顺序,所以就算没玩家加入/离开服务器,一些玩家也不见得就能流畅了
所以仁者见仁智者见智,中大服绝对不要拘泥于通过 "优化配置文件" 与 "jvm优参" 与 "分配更多资源" 来提升服务器性能
实际上正确的操作绝对不是分更多资源,我后文会继续说,但是我们先来解决这个问题
正确的操作是 架BC (或其他分布服务器,比如waterfall啊 velocity啊),我下文统称 "架BC" 了
但是这个架BC没有那么简单,比如说 我把"起床战争" "空岛战争" "监狱风云" 三个玩法变为三个子服
这是最常见的,最普遍的架BC
虽然 "分多个子服(群组)" 比 "不分子服(单端)" 的流畅度会大大提升,甚至可能提升了几十倍
但是实际上这并不能很好解决卡顿问题,因为对于大服而言,你每个子服里还是一堆玩家
当超过100人的时候,你就要警惕起来了,因为这个时候 "投入更多资源" 和 "优化配置" 已经没有先前的显著效果了
单个子服玩家数量超过120,150,乃至200以后,卡顿就会越来越厉害,这时 你还需要再次"架BC"
怎么架?
拿HY举例子,你可以看到HY有一堆大厅
如果是单纯的多世界,就凭大厅玩家数量,服务器绝对是卡爆的
所以HY的每个大厅都是一个子服
这是把本就是子服的 "大厅", 再拆成多个子服
再拿HY举例子,你可以看到起床战争玩家巨多
你就真以为hy的起床和你们的起床一样,都是靠起床插件+多世界插件?虽然看起来的确一模一样,没区别
但是其实人家每个起床地图都是一个单独的子服,或者说几个地图就是一个子服了
这就是把子服 "起床战争",再拆成了一堆子服
当然,你可能会需要用到数据库和一些独特的插件 我这里不展开了,有兴趣的自己研究,或者我们可以私下交流下喵
2、服务器玩法特色 服务器宣传 服务器的稳定性与流畅度 服务器的玩家数量
优先度如何?我该如何取舍?他们会怎么互相影响?
他们之间没有任何高低!他们是平等的,同时他们也是绝对不平等的!
他们之间存在必然联系,任意一部分发生变化也会导致另一部分变化
所以他们是动态平衡的
我简单的说就是,"我全都要"
但是我认为在 "玩法特色" 和 "稳定性与流畅度" 投入更多精力会有更值得,令人满意的回报
3、我有64G,我是给某个服务器分配64G(假设不用减去系统内存),还是分配32G?
显然,这个问题是从中型服务器出发的
但是实际上大型和中型都有用,小型服务器的也可以看看,虽然目前小型服务器没用
你要知道,如果你不分配堆的大小,那么新生代,老年代都是自动按比例分配的
那么你猜猜你的GC在32G的内存里找垃圾并清理,和在64G的内存里找&清理,哪个耗时久?
当然是后者,而且我们知道,运行GC也是要RAM的,分配的内存越大,更多内存会浪费在GC上
但是这个例子不鲜明
如果是在256G和128G里面取舍,我大概会去选128G,当然也要视情况而定啦
而且我认为mc服务器在正常的操作下根本吃不到32G以上
顺便来吐槽下MCBBS服主交流②群
群里至少8个骗子,此外有3个参与过d论坛,至少1个论坛号贩子,至少4位参与上次19年8月初的d优质服务器事件
3位快餐服腐竹/管理,还有一堆ddos狂魔,原喵core群里天天咬人的那种
200人不到,至少20个人间之屑。①群情况未知,我都不在里面
非常客观地提点建议,千万不要从任何mcbbs官方相关的qq群内找技术来你服务器,尤其是服务器相关的群
|