# MC服务器性能优化 ## 服务器性能指标 在开始优化你的服务器之前,你应该了解一些 MC 的性能指标。 MC 服务器中存在一些性能指标,保证这些指标在正常的范围内,可以让你的玩家在服务器中得到流畅的体验。 推荐在服务器上安装 TabTps 插件来方便观察服务器的一些性能指标。 ### TPS tps 为每秒进行的游戏刻数量,正常游戏中,每秒游戏会进行20刻,如果服务器卡顿,tps会显著下降,只要你的服务器没有过载,tps 应保持 20。 tps 与下文的 mspt 有着很大的关系,mspt 的数值直接决定了 tps 的高低。 ### MSPT mspt 为计算一个游戏刻度所需要的时间,单位为毫秒/ms(一秒为 1000ms),该指标的数值将直接影响 tps,mspt 在大于 50 时,即处理一个游戏刻需要的时间大于 50ms,换算下来,服务器将无法在 1s 内计算 20 个游戏刻,tps 会明显下降,正常服务器的 mspt 应保持在 50 以下。 mspt 的数值与游戏内一切占用 CPU 的行为有关,占用越高,mspt 数值越高。 :::tip MC 的大部分运算都在单线程上,很容易出现CPU的一个核心跑满,其他核心占用非常低的情况,**当主线程所在的核心跑满时,mspt 就会显著升高**。 主线程核心是不固定的,会在所有的核心之间变动,也很容易注意到会有一个核心占用达到 100%,而其他核心占用仅仅 10~20% 的情况,这很正常。 ::: ### ping ping 为向服务器发送数据包,直到收到回应所需的时间,单位为毫秒,ping值越大,延迟也就越高,当服务器负载过高时,服务器可能无法处理请求,也会导致 ping值过高。 在保证服务器主线程所在的核心负载不会过高的情况下,该数值可以可以通过优化网络来调整,在这里不会着重对此项进行优化。 安装 TabTps 插件,服务器游戏内按下 tab 键可以观察到服务器的这些性能指标。(来自群友的截图) ![](pictures/tabtps-1.png) ## 进行优化 了解上述的指标后,我们可以开始优化服务端,最应该注意的是 mspt 的数值,也就是减少 CPU 的占用,以下几个因素最容易占用 CPU。 - 实体数量 - 生物AI - 复杂的红石电路 - 区块的生成 ### 预生成区块 生成新的区块文件会消耗大量的性能,可以选择提前生成区块文件,仅需生成一次文件,这样当玩家在地图中游玩的时候,服务器仅需将区块数据发送给玩家即可。 **使用 [Chunky](https://modrinth.com/plugin/chunky?loader=paper) 插件来提前生成区块文件** Chunky 同时也是一个模组,在客户端也可以使用,且方法相同,用法如下。 快速开始使用: - chunky radius \ 设置半径 - chunky center [\ \] 设置中心块 - chunky start 在当前选区中开始新生成 - chunky pause 暂停并保存当前区块生成任务 - chunky continue 继续运行当前或保存的区块生成任务 - chunky cancel 停止并取消当前运行中的区块生成任务 - chunky progress 在游戏中显示所有任务的预生成进度 Chunky 默认选择(0,0)作为中心,500 作为半径,直接使用以下命令会以默认值开始生成: ```text /chunky start ``` 假设我们以世界(256,256)为中心,生成半径 1280 格的区块文件,可以这样输入命令: ```text /chunky radius 1280 /chunky center 256 256 /chunky start ``` 在控制台会产生如下输出: ```log [05:54:49 INFO]: [Chunky] Task started in world for the square region centered at 1280, 1280 with radius 1280. [05:54:49 INFO]: [Chunky] Task running for world. Processed: 51 chunks (1.21%), ETA: 0:00:13, Rate: 320.8 cps, Current: 13, 2 [05:54:50 INFO]: [Chunky] Task running for world. Processed: 451 chunks (10.67%), ETA: 0:00:09, Rate: 380.9 cps, Current: 13, 16 ``` 更多命令不做过多赘述,参考如下: - chunky selection 展示当前选区 - chunky world [world] 设置选中的世界 - chunky shape \ 设置目标形状 - chunky center [\ \] 设置中心块 - chunky worldborder 设置中心和半径以匹配所选世界的世界边界 - chunky spawn 设置中心至出生点 - chunky corners \ \ \ \ 根据角坐标设置选区 - chunky pattern \ 设置首选生成模式 - chunky silent 开关显示更新信息 - chunky quiet \ 设置更新消息的静默间隔(以秒为单位) - chunky reload 重新加载配置 - chunky trim 删除选区之外的块 ### 关闭不必要的生物AI 村民的 AI 是所有生物中最复杂的,对 CPU 的占用也非常高,当服务器中存在过多的村民时,过多的村民AI会吃掉服务器的大部分性能,禁用不必要的村民的 AI 是非常必要的。 **修改 nbt 来禁用生物的AI** 使用 /data 命令可以修改 nbt 数据,在村民的 nbt 标签中插入 {NoAI:"1b"} 即可禁用村民的生物 AI,使用以下命令修改村民的 nbt 标签来禁用 AI ```text /data merge entity @e[limit=1,type=villager,sort=nearest,distance=..5,nbt=!{NoAI:"1b"}] {{NoAI:"1b"}} ``` 此命令将选择5格内距离你最近的1名没有禁用 AI 的村民,并禁用其生物 AI。 如果批量禁用也很简单,仅需将以下命令放入循环型命令方块中,然后围绕着所有的村民跑一圈即可。 ```text execute at <你的游戏ID> run data merge entity @e[limit=1,type=villager,sort=nearest,distance=..5,nbt=!{NoAI:"1b"}] {{NoAI:"1b"}} ``` :::danger 不要禁用交易村民的AI,这会使村民无法正常补货!!! :::


***
--- 由 柏茯灵_RsDline 编写 ---
***