2020-05-06 11:48:49 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2020-04-11 07:52:17 +02:00
|
|
|
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
|
|
|
Date: Sun, 5 Apr 2020 22:23:14 -0500
|
|
|
|
Subject: [PATCH] Add tick times API and /mspt command
|
|
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/MSPTCommand.java b/src/main/java/com/destroystokyo/paper/MSPTCommand.java
|
|
|
|
new file mode 100644
|
2020-05-06 11:48:49 +02:00
|
|
|
index 0000000000000000000000000000000000000000..d0211d4f39f9d6af1d751ac66342b42cc6d7ba6d
|
2020-04-11 07:52:17 +02:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/MSPTCommand.java
|
|
|
|
@@ -0,0 +1,64 @@
|
|
|
|
+package com.destroystokyo.paper;
|
|
|
|
+
|
|
|
|
+import net.minecraft.server.MinecraftServer;
|
|
|
|
+import org.bukkit.ChatColor;
|
|
|
|
+import org.bukkit.Location;
|
|
|
|
+import org.bukkit.command.Command;
|
|
|
|
+import org.bukkit.command.CommandSender;
|
|
|
|
+
|
|
|
|
+import java.text.DecimalFormat;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.Arrays;
|
|
|
|
+import java.util.Collections;
|
|
|
|
+import java.util.List;
|
|
|
|
+
|
|
|
|
+public class MSPTCommand extends Command {
|
|
|
|
+ private static final DecimalFormat DF = new DecimalFormat("########0.0");
|
|
|
|
+
|
|
|
|
+ public MSPTCommand(String name) {
|
|
|
|
+ super(name);
|
|
|
|
+ this.description = "View server tick times";
|
|
|
|
+ this.usageMessage = "/mspt";
|
|
|
|
+ this.setPermission("bukkit.command.mspt");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public List<String> tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException {
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean execute(CommandSender sender, String commandLabel, String[] args) {
|
|
|
|
+ if (!testPermission(sender)) return true;
|
|
|
|
+
|
|
|
|
+ MinecraftServer server = MinecraftServer.getServer();
|
|
|
|
+
|
|
|
|
+ List<String> times = new ArrayList<>();
|
|
|
|
+ times.addAll(eval(server.tickTimes5s.getTimes()));
|
|
|
|
+ times.addAll(eval(server.tickTimes10s.getTimes()));
|
|
|
|
+ times.addAll(eval(server.tickTimes60s.getTimes()));
|
|
|
|
+
|
|
|
|
+ sender.sendMessage("§6Server tick times §e(§7avg§e/§7min§e/§7max§e)§6 from last 5s§7,§6 10s§7,§6 1m§e:");
|
|
|
|
+ sender.sendMessage(String.format("§6◴ %s§7/%s§7/%s§e, %s§7/%s§7/%s§e, %s§7/%s§7/%s", times.toArray()));
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static List<String> eval(long[] times) {
|
|
|
|
+ long min = Integer.MAX_VALUE;
|
|
|
|
+ long max = 0L;
|
|
|
|
+ long total = 0L;
|
|
|
|
+ for (long value : times) {
|
|
|
|
+ if (value > 0L && value < min) min = value;
|
|
|
|
+ if (value > max) max = value;
|
|
|
|
+ total += value;
|
|
|
|
+ }
|
|
|
|
+ double avgD = ((double) total / (double) times.length) * 1.0E-6D;
|
|
|
|
+ double minD = ((double) min) * 1.0E-6D;
|
|
|
|
+ double maxD = ((double) max) * 1.0E-6D;
|
|
|
|
+ return Arrays.asList(getColor(avgD), getColor(minD), getColor(maxD));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static String getColor(double avg) {
|
|
|
|
+ return ChatColor.COLOR_CHAR + (avg >= 50 ? "c" : avg >= 40 ? "e" : "a") + DF.format(avg);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
2020-05-06 11:48:49 +02:00
|
|
|
index 9f1662ece533f5ea744662b718e2d89ace3107fb..e0d7832c3a081b54a0e3a27380015477897fdf6d 100644
|
2020-04-11 07:52:17 +02:00
|
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
|
|
@@ -70,6 +70,7 @@ public class PaperConfig {
|
|
|
|
|
|
|
|
commands = new HashMap<String, Command>();
|
|
|
|
commands.put("paper", new PaperCommand("paper"));
|
|
|
|
+ commands.put("mspt", new MSPTCommand("mspt"));
|
|
|
|
|
|
|
|
version = getInt("config-version", 20);
|
|
|
|
set("config-version", 20);
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
2020-05-06 11:48:49 +02:00
|
|
|
index 3c25436f158316d2e09cbf4673365eddb03ecef4..5f57a9e1c8d5f641facdadbd1877637a8fe8daf5 100644
|
2020-04-11 07:52:17 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
|
|
@@ -106,6 +106,11 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
|
|
private int G;
|
|
|
|
private int H;
|
|
|
|
public final long[] f = new long[100]; public long[] getTickTimes() { return f; } // Paper - OBFHELPER
|
|
|
|
+ // Paper start
|
|
|
|
+ public final TickTimes tickTimes5s = new TickTimes(100);
|
|
|
|
+ public final TickTimes tickTimes10s = new TickTimes(200);
|
|
|
|
+ public final TickTimes tickTimes60s = new TickTimes(1200);
|
|
|
|
+ // Paper end
|
|
|
|
@Nullable
|
|
|
|
private KeyPair I;
|
|
|
|
@Nullable
|
Improve mid tick chunk loading, Fix Oversleep, other improvements
Process loads outside of any canSleep check. Original intent was to
only apply those restrictions to generations but realized I had some
checks higher up the call chain.
Reworked the back off strategy to just run every 1 millisecond per world,
and to apply the per tick limit to generations only.
This guarantees that your chunk will load with at most around 1ms delay.
Additionally, fire midTick processing in a few more places, notably the
oversleep section so we can keep processing loads here too which has
a large up to 50ms window...
Speaking of oversleep, we had a bug in our implementation changes for
Timings that caused oversleep to not sleep the correct amount.
Because we now moved it into the NEXT tick instead of THIS tick, the
value of nextTick had already been increased to +50ms, resulting in
the risk of sleeping more than it should, but, more importantly, this
caused every task that was trying to NOT run during oversleep to actually
run during oversleep.
This is now fixed.
Another small tweak is to the /tps command, to no longer show the star when
TPS is right at 20.
Due to ineffeciencies in the sleep precision, TPS is commonly 20.02.
This causes the star to show up almost constantly, so now only show it if
we actually hit a real "catchup".
This commit also improves the changes to the CallbackExecutor, in that
it now is also recursion safe.
It was possible that the executor could run tasks out of desired order
if the executor task scheduled more executor tasks.
We solve this by ensuring new additions do not enter the currently iterated queue.
Each depth level will have its own queue.
Fixes #3220
2020-04-26 05:47:29 +02:00
|
|
|
@@ -1186,6 +1191,12 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
2020-04-16 03:48:07 +02:00
|
|
|
this.av = this.av * 0.8F + (float) l / 1000000.0F * 0.19999999F;
|
|
|
|
long i1 = SystemUtils.getMonotonicNanos();
|
2020-04-11 07:52:17 +02:00
|
|
|
|
|
|
|
+ // Paper start
|
|
|
|
+ tickTimes5s.add(this.ticks, l);
|
|
|
|
+ tickTimes10s.add(this.ticks, l);
|
|
|
|
+ tickTimes60s.add(this.ticks, l);
|
|
|
|
+ // Paper end
|
|
|
|
+
|
2020-04-16 03:48:07 +02:00
|
|
|
this.circularTimer.a(i1 - i);
|
|
|
|
this.methodProfiler.exit();
|
|
|
|
org.spigotmc.WatchdogThread.tick(); // Spigot
|
Improve mid tick chunk loading, Fix Oversleep, other improvements
Process loads outside of any canSleep check. Original intent was to
only apply those restrictions to generations but realized I had some
checks higher up the call chain.
Reworked the back off strategy to just run every 1 millisecond per world,
and to apply the per tick limit to generations only.
This guarantees that your chunk will load with at most around 1ms delay.
Additionally, fire midTick processing in a few more places, notably the
oversleep section so we can keep processing loads here too which has
a large up to 50ms window...
Speaking of oversleep, we had a bug in our implementation changes for
Timings that caused oversleep to not sleep the correct amount.
Because we now moved it into the NEXT tick instead of THIS tick, the
value of nextTick had already been increased to +50ms, resulting in
the risk of sleeping more than it should, but, more importantly, this
caused every task that was trying to NOT run during oversleep to actually
run during oversleep.
This is now fixed.
Another small tweak is to the /tps command, to no longer show the star when
TPS is right at 20.
Due to ineffeciencies in the sleep precision, TPS is commonly 20.02.
This causes the star to show up almost constantly, so now only show it if
we actually hit a real "catchup".
This commit also improves the changes to the CallbackExecutor, in that
it now is also recursion safe.
It was possible that the executor could run tasks out of desired order
if the executor task scheduled more executor tasks.
We solve this by ensuring new additions do not enter the currently iterated queue.
Each depth level will have its own queue.
Fixes #3220
2020-04-26 05:47:29 +02:00
|
|
|
@@ -2272,4 +2283,30 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
2020-04-11 07:52:17 +02:00
|
|
|
return SERVER; // Paper
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
|
|
|
+
|
|
|
|
+ // Paper start
|
|
|
|
+ public static class TickTimes {
|
|
|
|
+ private final long[] times;
|
|
|
|
+
|
|
|
|
+ public TickTimes(int length) {
|
|
|
|
+ times = new long[length];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void add(int index, long time) {
|
|
|
|
+ times[index % times.length] = time;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public long[] getTimes() {
|
|
|
|
+ return times.clone();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public double getAverage() {
|
|
|
|
+ long total = 0L;
|
|
|
|
+ for (long value : times) {
|
|
|
|
+ total += value;
|
|
|
|
+ }
|
|
|
|
+ return ((double) total / (double) times.length) * 1.0E-6D;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
2020-05-06 11:48:49 +02:00
|
|
|
index e8d3528d515754affb14c947109ccdf1739d9745..4a41003203b316e45622360f97a897d1fad6cda0 100644
|
2020-04-11 07:52:17 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
2020-04-27 09:34:45 +02:00
|
|
|
@@ -2053,6 +2053,16 @@ public final class CraftServer implements Server {
|
2020-04-11 07:52:17 +02:00
|
|
|
net.minecraft.server.MinecraftServer.getServer().tps15.getAverage()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public long[] getTickTimes() {
|
|
|
|
+ return getServer().tickTimes5s.getTimes();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public double getAverageTickTime() {
|
|
|
|
+ return getServer().tickTimes5s.getAverage();
|
|
|
|
+ }
|
|
|
|
// Paper end
|
|
|
|
|
|
|
|
private final Spigot spigot = new Spigot()
|