mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-01 17:01:56 +01:00
Improve Thread Pool usage to allow single threads for single cpu servers
Switch to a standard fixed size ThreadPoolExecutor as we don't use the advanced capabilities of a ForkJoinPool. ForkJoinPool does not allow single threads, and really rather not use 2 different executor types based on core count. Also, change thread priorities so that main thread is prioritized by the OS at a higher priority than the other threads. May not help too much but it at least signals the OS the information to know main is more important.
This commit is contained in:
parent
55e3e3d0f8
commit
9ad7e2fe15
3 changed files with 90 additions and 33 deletions
|
@ -3830,19 +3830,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
}
|
}
|
||||||
+ // Paper end
|
+ // Paper end
|
||||||
}
|
}
|
||||||
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 @@ public class SystemUtils {
|
|
||||||
i = Integer.getInteger("Paper.WorkerThreadCount", i); // Paper - allow overriding
|
|
||||||
Object object;
|
|
||||||
|
|
||||||
- if (i <= 0) {
|
|
||||||
+ if (i <= 0 || (Runtime.getRuntime().availableProcessors() == 1 && !Boolean.getBoolean("Paper.allowAsyncChunksSingleCore"))) { // Paper - disable server worker queue if single core system
|
|
||||||
object = MoreExecutors.newDirectExecutorService();
|
|
||||||
} else {
|
|
||||||
object = new ForkJoinPool(i, (forkjoinpool) -> {
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/TicketType.java b/src/main/java/net/minecraft/server/TicketType.java
|
diff --git a/src/main/java/net/minecraft/server/TicketType.java b/src/main/java/net/minecraft/server/TicketType.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/TicketType.java
|
--- a/src/main/java/net/minecraft/server/TicketType.java
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
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
|
||||||
|
dedicatedserver.setEraseCache(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ dedicatedserver.serverThread.setPriority(Thread.NORM_PRIORITY+2); // Paper - boost priority
|
||||||
|
dedicatedserver.serverThread.start();
|
||||||
|
// CraftBukkit end
|
||||||
|
} catch (Exception exception) {
|
||||||
|
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.CompletionException;
|
||||||
|
+import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
+
|
||||||
|
+public class ServerWorkerThread extends Thread {
|
||||||
|
+ private static final AtomicInteger threadId = new AtomicInteger(1);
|
||||||
|
+ public ServerWorkerThread(Runnable target) {
|
||||||
|
+ super(target, "Server-Worker-" + threadId.getAndIncrement());
|
||||||
|
+ setPriority(Thread.NORM_PRIORITY-1); // Deprioritize over main
|
||||||
|
+ this.setUncaughtExceptionHandler((thread, throwable) -> {
|
||||||
|
+ if (throwable instanceof CompletionException) {
|
||||||
|
+ throwable = throwable.getCause();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (throwable instanceof ReportedException) {
|
||||||
|
+ DispenserRegistry.a(((ReportedException) throwable).a().e());
|
||||||
|
+ System.exit(-1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ MinecraftServer.LOGGER.error(String.format("Caught exception in thread %s", thread), throwable);
|
||||||
|
+ });
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
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 @@ public class SystemUtils {
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ExecutorService k() {
|
||||||
|
- int i = MathHelper.clamp(Runtime.getRuntime().availableProcessors() - 1, 1, 7);
|
||||||
|
- Object object;
|
||||||
|
+ // 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>(), ServerWorkerThread::new);
|
||||||
|
+ }
|
||||||
|
+ /*
|
||||||
|
protected void onTermination(Throwable throwable) {
|
||||||
|
if (throwable != null) {
|
||||||
|
SystemUtils.LOGGER.warn("{} died", this.getName(), throwable);
|
||||||
|
@@ -0,0 +0,0 @@ public class SystemUtils {
|
||||||
|
|
||||||
|
SystemUtils.LOGGER.error(String.format("Caught exception in thread %s", thread), throwable);
|
||||||
|
}, true);
|
||||||
|
- }
|
||||||
|
+ }*/ // Paper end
|
||||||
|
|
||||||
|
return (ExecutorService) object;
|
||||||
|
}
|
|
@ -1,20 +0,0 @@
|
||||||
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] Use more reasonable thread count default for bootstrap
|
|
||||||
|
|
||||||
|
|
||||||
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 @@ public class SystemUtils {
|
|
||||||
}
|
|
||||||
|
|
||||||
private static ExecutorService k() {
|
|
||||||
- int i = MathHelper.clamp(Runtime.getRuntime().availableProcessors() - 1, 1, 7);
|
|
||||||
+ int i = Math.min(8, Math.max(Runtime.getRuntime().availableProcessors() - 2, 2)); // Paper - use more reasonable default - 2 is hard minimum to avoid using unlimited threads
|
|
||||||
+ i = Integer.getInteger("Paper.WorkerThreadCount", i); // Paper - allow overriding
|
|
||||||
Object object;
|
|
||||||
|
|
||||||
if (i <= 0) {
|
|
Loading…
Reference in a new issue