CPU affinity for netty I/O threads

This commit is contained in:
MrHua269
2026-07-10 21:51:55 +08:00
parent 354879ea76
commit 1084b4aa3b
2 changed files with 36 additions and 2 deletions
@@ -17,3 +17,17 @@ index 5a72fa0d72bfdb927293abe921c57f6ae964a6ec..913161732b0affa70fb114dd4087a610
ret.setUncaughtExceptionHandler(TickRegionScheduler.this::uncaughtException);
return ret;
}
diff --git a/net/minecraft/server/network/EventLoopGroupHolder.java b/net/minecraft/server/network/EventLoopGroupHolder.java
index 9544eaee7e02d00226d957ea0b79cd1a1fb0c4d0..4e138fe36aa0bc519482990b60543b17ee2f388f 100644
--- a/net/minecraft/server/network/EventLoopGroupHolder.java
+++ b/net/minecraft/server/network/EventLoopGroupHolder.java
@@ -98,7 +98,8 @@ public abstract class EventLoopGroupHolder {
}
private ThreadFactory createThreadFactory() {
- return new ThreadFactoryBuilder().setNameFormat("Netty " + this.type + " IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER)).build(); // Paper
+ var origin = new ThreadFactoryBuilder().setNameFormat("Netty " + this.type + " IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER)).build(); // Paper // Camellia - Add config for cpu affinity
+ return run -> origin.newThread(moe.monnairealms.camellia.config.modules.optimizations.CpuAffinityConfig.wrapForNettyIo(run)); // Camellia - Add config for cpu affinity
}
protected abstract IoHandlerFactory ioHandlerFactory();
@@ -30,6 +30,8 @@ public class CpuAffinityConfig implements IConfigModule {
@HotReloadUnsupported
@ConfigInfo(name = "enable_for_chunksystem_io")
public static boolean enabledForChunkSystemIo = false;
@ConfigInfo(name = "enable_for_netty_io")
public static boolean enableForNettyIo = false;
@HotReloadUnsupported
@ConfigInfo(name = "tickregion_affinity", comments = "The core number you want the tick region threads to bind on")
@@ -49,6 +51,12 @@ public class CpuAffinityConfig implements IConfigModule {
.stream()
.mapToObj(String::valueOf)
.toList();
@HotReloadUnsupported
@ConfigInfo(name = "netty_io_affinity")
public static List<String> nettyIoAffinity = Affinity.getAffinity()
.stream()
.mapToObj(String::valueOf)
.toList();
@DoNotLoad
private static boolean inited = false;
@@ -60,6 +68,8 @@ public class CpuAffinityConfig implements IConfigModule {
public static AffinityRunnableWrapper chunkSystemWorkerRunnableWrapper;
@DoNotLoad
public static AffinityRunnableWrapper chunkSystemIoRunnableWrapper;
@DoNotLoad
public static AffinityRunnableWrapper nettyIoRunnableWrapper;
public static Runnable wrapForTickRegion(Runnable in) {
return tickRegionRunnableWrapper == null ? in : tickRegionRunnableWrapper.wrap(in);
@@ -73,8 +83,17 @@ public class CpuAffinityConfig implements IConfigModule {
return chunkSystemIoRunnableWrapper == null ? in : chunkSystemIoRunnableWrapper.wrap(in);
}
public static Runnable wrapForNettyIo(Runnable in) {
return nettyIoRunnableWrapper == null ? in : nettyIoRunnableWrapper.wrap(in);
}
@Override
public void onLoaded(CommentedFileConfig configInstance, @Nullable Set<Exception> e) {
if (inited) {
return;
}
inited = true;
if (enabledForTickRegion) {
tickRegionRunnableWrapper = new AffinityRunnableWrapper("tick_region", parseAffinity(tickRegionAffinity));
LOGGER.info("Tick region thread now bound to: {}", tickRegionRunnableWrapper.getAffinity());
@@ -90,8 +109,9 @@ public class CpuAffinityConfig implements IConfigModule {
LOGGER.info("Chunk system worker thread now bound to: {}", chunkSystemIoRunnableWrapper.getAffinity());
}
if (!inited) {
inited = true;
if (enableForNettyIo) {
nettyIoRunnableWrapper = new AffinityRunnableWrapper("netty_io", parseAffinity(nettyIoAffinity));
LOGGER.info("Netty I/O thread now bound to: {}", nettyIoRunnableWrapper.getAffinity());
}
}