mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-30 16:19:03 +01:00
06e816fd71
1.16.2 introduced 2 thread pools for Bootstrap vs main we didn't account for. This also sets Bootstrap priority to be 1 less thread priority too so MC Main threads will always have more priority specially on servers running multiple instances, since bootstrap tends to use up all CPU.
99 lines
4.9 KiB
Diff
99 lines
4.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Tue, 23 Oct 2018 23:14:38 -0400
|
|
Subject: [PATCH] Improve Server Thread Pool and Thread Priorities
|
|
|
|
Use a simple executor since Fork join is a much more complex pool
|
|
type and we are not using its capabilities.
|
|
|
|
Set thread priorities so main thread has above normal priority over
|
|
server threads
|
|
|
|
Allow usage of a single thread executor by not using ForkJoin so single core CPU's.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
S s0 = function.apply(thread); // CraftBukkit - decompile error
|
|
|
|
atomicreference.set(s0);
|
|
+ thread.setPriority(Thread.NORM_PRIORITY+2); // Paper - boost priority
|
|
thread.start();
|
|
return s0;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/ServerWorkerThread.java b/src/main/java/net/minecraft/server/ServerWorkerThread.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/ServerWorkerThread.java
|
|
@@ -0,0 +0,0 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
+
|
|
+public class ServerWorkerThread extends Thread {
|
|
+ private static final AtomicInteger threadId = new AtomicInteger(1);
|
|
+ public ServerWorkerThread(Runnable target, String poolName, int prioritityModifier) {
|
|
+ super(target, "Worker-" + poolName + "-" + threadId.getAndIncrement());
|
|
+ setPriority(Thread.NORM_PRIORITY+prioritityModifier); // Deprioritize over main
|
|
+ this.setDaemon(true);
|
|
+ this.setUncaughtExceptionHandler(SystemUtils::onThreadError);
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/SystemUtils.java b/src/main/java/net/minecraft/server/SystemUtils.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/server/SystemUtils.java
|
|
+++ b/src/main/java/net/minecraft/server/SystemUtils.java
|
|
@@ -0,0 +0,0 @@ import org.apache.logging.log4j.Logger;
|
|
public class SystemUtils {
|
|
|
|
private static final AtomicInteger c = new AtomicInteger(1);
|
|
- private static final ExecutorService d = a("Bootstrap");
|
|
- private static final ExecutorService e = a("Main");
|
|
+ private static final ExecutorService d = a("Bootstrap", -2); // Paper - add -2 priority
|
|
+ private static final ExecutorService e = a("Main", -1); // Paper - add -1 priority
|
|
private static final ExecutorService f = n();
|
|
public static LongSupplier a = System::nanoTime;
|
|
public static final UUID b = new UUID(0L, 0L); public static final UUID getNullUUID() {return b;} // Paper OBFHELPER
|
|
@@ -0,0 +0,0 @@ public class SystemUtils {
|
|
return Instant.now().toEpochMilli();
|
|
}
|
|
|
|
- private static ExecutorService a(String s) {
|
|
- int i = MathHelper.clamp(Runtime.getRuntime().availableProcessors() - 1, 1, 7);
|
|
- Object object;
|
|
+ private static ExecutorService a(String s, int priorityModifier) { // Paper - add priority
|
|
+ // Paper start - use simpler thread pool that allows 1 thread
|
|
+ int i = Math.min(8, Math.max(Runtime.getRuntime().availableProcessors() - 2, 1));
|
|
+ i = Integer.getInteger("Paper.WorkerThreadCount", i);
|
|
+ ExecutorService object;
|
|
|
|
if (i <= 0) {
|
|
object = MoreExecutors.newDirectExecutorService();
|
|
} else {
|
|
- object = new ForkJoinPool(i, (forkjoinpool) -> {
|
|
- ForkJoinWorkerThread forkjoinworkerthread = new ForkJoinWorkerThread(forkjoinpool) {
|
|
+ object = new java.util.concurrent.ThreadPoolExecutor(i, i,0L, TimeUnit.MILLISECONDS, new java.util.concurrent.LinkedBlockingQueue<Runnable>(), target -> new ServerWorkerThread(target, s, priorityModifier));
|
|
+ }
|
|
+ /*
|
|
protected void onTermination(Throwable throwable) {
|
|
if (throwable != null) {
|
|
SystemUtils.LOGGER.warn("{} died", this.getName(), throwable);
|
|
@@ -0,0 +0,0 @@ public class SystemUtils {
|
|
return forkjoinworkerthread;
|
|
}, SystemUtils::a, true);
|
|
}
|
|
+ }*/ // Paper end
|
|
|
|
return (ExecutorService) object;
|
|
}
|
|
@@ -0,0 +0,0 @@ public class SystemUtils {
|
|
});
|
|
}
|
|
|
|
+ public static void onThreadError(Thread thread, Throwable throwable) { a(thread, throwable); } // Paper - OBFHELPER
|
|
private static void a(Thread thread, Throwable throwable) {
|
|
c(throwable);
|
|
if (throwable instanceof CompletionException) {
|