aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0262-Improve-Server-Thread-Pool-and-Thread-Priorities.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0262-Improve-Server-Thread-Pool-and-Thread-Priorities.patch')
-rw-r--r--patches/server/0262-Improve-Server-Thread-Pool-and-Thread-Priorities.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/patches/server/0262-Improve-Server-Thread-Pool-and-Thread-Priorities.patch b/patches/server/0262-Improve-Server-Thread-Pool-and-Thread-Priorities.patch
new file mode 100644
index 0000000000..278b5c5f14
--- /dev/null
+++ b/patches/server/0262-Improve-Server-Thread-Pool-and-Thread-Priorities.patch
@@ -0,0 +1,105 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+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
+and reduce worldgen thread worker count for low core count CPUs.
+
+== AT ==
+public net.minecraft.Util onThreadException(Ljava/lang/Thread;Ljava/lang/Throwable;)V
+
+Co-authored-by: Spottedleaf <[email protected]>
+
+diff --git a/src/main/java/io/papermc/paper/util/ServerWorkerThread.java b/src/main/java/io/papermc/paper/util/ServerWorkerThread.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..b60f59cf5cc8eb84a6055b7861857dece7f2501b
+--- /dev/null
++++ b/src/main/java/io/papermc/paper/util/ServerWorkerThread.java
+@@ -0,0 +1,14 @@
++package io.papermc.paper.util;
++
++import java.util.concurrent.atomic.AtomicInteger;
++import net.minecraft.Util;
++
++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(Util::onThreadException);
++ }
++}
+diff --git a/src/main/java/net/minecraft/Util.java b/src/main/java/net/minecraft/Util.java
+index 54562fa04d14a937451ea7aa9d80194f2c31b471..4cf88f6d815d60cfbf8e4ecf9d96d0cfadd0620b 100644
+--- a/src/main/java/net/minecraft/Util.java
++++ b/src/main/java/net/minecraft/Util.java
+@@ -89,7 +89,7 @@ public class Util {
+ private static final int DEFAULT_MAX_THREADS = 255;
+ private static final int DEFAULT_SAFE_FILE_OPERATION_RETRIES = 10;
+ private static final String MAX_THREADS_SYSTEM_PROPERTY = "max.bg.threads";
+- private static final ExecutorService BACKGROUND_EXECUTOR = makeExecutor("Main");
++ private static final ExecutorService BACKGROUND_EXECUTOR = makeExecutor("Main", -1); // Paper - Perf: add priority
+ private static final ExecutorService IO_POOL = makeIoExecutor("IO-Worker-", false);
+ private static final ExecutorService DOWNLOAD_POOL = makeIoExecutor("Download-", true);
+ // Paper start - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
+@@ -160,15 +160,27 @@ public class Util {
+ return FILENAME_DATE_TIME_FORMATTER.format(ZonedDateTime.now());
+ }
+
+- private static ExecutorService makeExecutor(String name) {
+- int i = Mth.clamp(Runtime.getRuntime().availableProcessors() - 1, 1, getMaxThreads());
++ private static ExecutorService makeExecutor(String s, int priorityModifier) { // Paper - Perf: add priority
++ // Paper start - Perf: use simpler thread pool that allows 1 thread and reduce worldgen thread worker count for low core count CPUs
++ int cpus = Runtime.getRuntime().availableProcessors() / 2;
++ int i;
++ if (cpus <= 4) {
++ i = cpus <= 2 ? 1 : 2;
++ } else if (cpus <= 8) {
++ // [5, 8]
++ i = Math.max(3, cpus - 2);
++ } else {
++ i = cpus * 2 / 3;
++ }
++ i = Math.min(8, i);
++ i = Integer.getInteger("Paper.WorkerThreadCount", i);
+ ExecutorService executorService;
+ if (i <= 0) {
+ executorService = MoreExecutors.newDirectExecutorService();
+ } else {
+- AtomicInteger atomicInteger = new AtomicInteger(1);
+- executorService = new ForkJoinPool(i, pool -> {
+- ForkJoinWorkerThread forkJoinWorkerThread = new ForkJoinWorkerThread(pool) {
++ executorService = new java.util.concurrent.ThreadPoolExecutor(i, i,0L, TimeUnit.MILLISECONDS, new java.util.concurrent.LinkedBlockingQueue<>(), target -> new io.papermc.paper.util.ServerWorkerThread(target, s, priorityModifier));
++ }
++ /*
+ @Override
+ protected void onTermination(Throwable throwable) {
+ if (throwable != null) {
+@@ -184,6 +196,7 @@ public class Util {
+ return forkJoinWorkerThread;
+ }, Util::onThreadException, true);
+ }
++ }*/ // Paper end - Perf: use simpler thread pool
+
+ return executorService;
+ }
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index 5d429b707383e6620a0d83f23d7a8694ecc70735..995ee6b2af01a14d61a031008dd05518668a98ae 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -323,6 +323,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ thread.setUncaughtExceptionHandler((thread1, throwable) -> {
+ MinecraftServer.LOGGER.error("Uncaught exception in server thread", throwable);
+ });
++ thread.setPriority(Thread.NORM_PRIORITY+2); // Paper - Perf: Boost priority
+ if (Runtime.getRuntime().availableProcessors() > 4) {
+ thread.setPriority(8);
+ }