mirror of
https://github.com/PaperMC/Folia.git
synced 2025-01-25 22:01:57 +01:00
c9ded2de1c
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.
87 lines
4.7 KiB
Diff
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)))
|