Folia/patches/server/0009-Add-chunk-system-throughput-counters-to-tps.patch
Spottedleaf c9ded2de1c Add entity/player/chunk counters to /tps
Required to add some basic hacks to expose a regionstats object
in the TickRegions data class, but this ensures that the retrieval
is thread-safe and could possibly support other data exposure
for async reads.

Additionally, since DecimalFormat is not thread-safe we need
to use ThreadLocals to instantiate them. Change the format
as well to use commas to separate groups of digits when
formatting large numbers so they are easier to read.
For example, 1000 becomes 1,000.
2023-04-08 18:44:37 -07:00

87 lines
4.7 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Fri, 10 Mar 2023 00:16:26 -0800
Subject: [PATCH] Add chunk system throughput counters to /tps
diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkFullTask.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkFullTask.java
index 300700477ee34bc22b31315825c0e40f61070cd5..0b78d1eb90500e0123b7281d722805dc65d551d0 100644
--- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkFullTask.java
+++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkFullTask.java
@@ -22,6 +22,9 @@ public final class ChunkFullTask extends ChunkProgressionTask implements Runnabl
protected final ChunkAccess fromChunk;
protected final PrioritisedExecutor.PrioritisedTask convertToFullTask;
+ public static final io.papermc.paper.util.IntervalledCounter chunkLoads = new io.papermc.paper.util.IntervalledCounter(java.util.concurrent.TimeUnit.SECONDS.toNanos(15L));
+ public static final io.papermc.paper.util.IntervalledCounter chunkGenerates = new io.papermc.paper.util.IntervalledCounter(java.util.concurrent.TimeUnit.SECONDS.toNanos(15L));
+
public ChunkFullTask(final ChunkTaskScheduler scheduler, final ServerLevel world, final int chunkX, final int chunkZ,
final NewChunkHolder chunkHolder, final ChunkAccess fromChunk, final PrioritisedExecutor.Priority priority) {
super(scheduler, world, chunkX, chunkZ);
@@ -35,6 +38,20 @@ public final class ChunkFullTask extends ChunkProgressionTask implements Runnabl
return ChunkStatus.FULL;
}
+ public static double genRate(final long time) {
+ synchronized (chunkGenerates) {
+ chunkGenerates.updateCurrentTime(time);
+ return chunkGenerates.getRate();
+ }
+ }
+
+ public static double loadRate(final long time) {
+ synchronized (chunkLoads) {
+ chunkLoads.updateCurrentTime(time);
+ return chunkLoads.getRate();
+ }
+ }
+
@Override
public void run() {
// See Vanilla protoChunkToFullChunk for what this function should be doing
@@ -49,6 +66,17 @@ public final class ChunkFullTask extends ChunkProgressionTask implements Runnabl
this.world.getPoiManager().checkConsistency(this.fromChunk);
}
+ final long time = System.nanoTime();
+ if (this.fromChunk instanceof ImposterProtoChunk wrappedFull) {
+ synchronized (chunkLoads) {
+ chunkLoads.updateAndAdd(1L, time);
+ }
+ } else {
+ synchronized (chunkGenerates) {
+ chunkGenerates.updateAndAdd(1L, time);
+ }
+ }
+
if (this.fromChunk instanceof ImposterProtoChunk wrappedFull) {
chunk = wrappedFull.getWrapped();
} else {
diff --git a/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java b/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java
index 3bcb1dc98c61e025874cc9e008faa722581a530c..0b48f45760829f1f4813b5f0f23e920dca7b1c45 100644
--- a/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java
+++ b/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java
@@ -170,6 +170,9 @@ public final class CommandServerHealth extends Command {
totalUtil += (report == null ? 0.0 : report.utilisation());
}
+ final double genRate = io.papermc.paper.chunk.system.scheduling.ChunkFullTask.genRate(currTime);
+ final double loadRate = io.papermc.paper.chunk.system.scheduling.ChunkFullTask.loadRate(currTime);
+
totalUtil += globalTickReport.utilisation();
tpsByRegion.sort(null);
@@ -284,6 +287,12 @@ public final class CommandServerHealth extends Command {
.append(Component.text(ONE_DECIMAL_PLACES.get().format(maxThreadCount * 100.0), INFORMATION))
.append(Component.text("%\n", PRIMARY))
+ .append(Component.text(" - ", LIST, TextDecoration.BOLD))
+ .append(Component.text("Load rate: ", PRIMARY))
+ .append(Component.text(TWO_DECIMAL_PLACES.get().format(loadRate) + ", ", INFORMATION))
+ .append(Component.text("Gen rate: ", PRIMARY))
+ .append(Component.text(TWO_DECIMAL_PLACES.get().format(genRate) + "\n", INFORMATION))
+
.append(Component.text(" - ", LIST, TextDecoration.BOLD))
.append(Component.text("Lowest Region TPS: ", PRIMARY))
.append(Component.text(TWO_DECIMAL_PLACES.get().format(minTps) + "\n", CommandUtil.getColourForTPS(minTps)))