今早无意查看我服Sponge服务端刷出大量的:
1 | Can't keep up! Did the system time change, or is the server overloaded? Running 5400ms behind, skipping 108 tick(s) |
也就代表某个线程跑满 tick主频不够用了。
但是得排查出具体原因,首先我们先使用htop看下CPU占用率,和主线程PID
发现占用挺高…..现在用查到的PID进入arthas里面
输入:dashboard
发现服务端主线程长时间占用率还挺高。
然后尝试几次 thread -n 2 查询占用最高的2个线程
1 | thread -n 2 |
发现格雷科技里的线缆这个功能 dispatchEnergyToNode方法 CPU使用率异常高
然后去Github上看了GTCE的这一块代码
发现metaTileEntity实体触发更新导致以上流程里面几层循环调用,消耗大…..作者这么写心宽啊
好了我们要查一下metaTileEntity下面具体到游戏里的哪一个方块,从物理上解决….
从上面的代码可以看出来
1 | at gregtech.api.metatileentity.MetaTileEntity.update(MetaTileEntity.java:557) |
在做更新操作看看这个更新代码是在哪里调用的
这里好像是判断是否存在这个东西
我们使用arthas 的 watch 看看这个实体里面有什么
1 | watch gregtech.api.metatileentity.MetaTileEntity shouldUpdate "params" -x 3 -b |
params是调方法的参数 -b是标识调用前的内容 -x 3 是对象深度3层,这个对象在第三层貌似就获取到了坐标数据
我就取了一个查询耗时最长的一个实体到游戏里看看,应该是个多结构方块。
游戏里/tppos 411 3 -478
最后查询到罪魁祸首应该是这些方块….
结果:阵列涡轮系统里的动力仓能源一直在更新导致卡服 (呕
大概思路就是这样吧,Minecraft和区块世界相关都在主线程上,所以开MC服务器还是用尽量高主频U,另外阿里的arthas排查JVM问题超级好用!