Bind threads to cores

This commit is contained in:
mcrcortex
2025-05-19 12:40:46 +10:00
parent 4a5961d656
commit 128f8eda98
2 changed files with 34 additions and 5 deletions

View File

@@ -3,6 +3,7 @@ package me.cortex.voxy.common.thread;
import me.cortex.voxy.common.Logger; import me.cortex.voxy.common.Logger;
import me.cortex.voxy.common.util.Pair; import me.cortex.voxy.common.util.Pair;
import me.cortex.voxy.common.util.ThreadUtils; import me.cortex.voxy.common.util.ThreadUtils;
import me.cortex.voxy.common.util.cpu.CpuLayout;
import java.lang.invoke.VarHandle; import java.lang.invoke.VarHandle;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
@@ -32,11 +33,25 @@ public class ServiceThreadPool {
} }
public ServiceThreadPool(int threadCount, int priority) { public ServiceThreadPool(int threadCount, int priority) {
if (CpuLayout.CORES.length-2 < threadCount) {
Logger.warn("The thread count over core count -2, performance degradation possible");
}
this.threadGroup = new ThreadGroup("Service job workers"); this.threadGroup = new ThreadGroup("Service job workers");
this.workers = new Thread[threadCount]; this.workers = new Thread[threadCount];
for (int i = 0; i < threadCount; i++) { for (int i = 0; i < threadCount; i++) {
int threadId = i; int threadId = i;
var worker = new Thread(this.threadGroup, ()->this.worker(threadId)); var worker = new Thread(this.threadGroup, ()->{
if (CpuLayout.CORES.length>3) {
//Set worker affinity if possible
CpuLayout.setThreadAffinity(CpuLayout.CORES[2 + (threadId % (CpuLayout.CORES.length - 2))]);
}
ThreadUtils.SetSelfThreadPriorityWin32(ThreadUtils.WIN32_THREAD_PRIORITY_LOWEST);
//ThreadUtils.SetSelfThreadPriorityWin32(ThreadUtils.WIN32_THREAD_MODE_BACKGROUND_BEGIN);
this.worker(threadId);
});
worker.setDaemon(false); worker.setDaemon(false);
worker.setName("Service worker #" + i); worker.setName("Service worker #" + i);
worker.setPriority(priority); worker.setPriority(priority);
@@ -133,9 +148,6 @@ public class ServiceThreadPool {
} }
private void worker(int threadId) { private void worker(int threadId) {
ThreadUtils.SetSelfThreadPriorityWin32(ThreadUtils.WIN32_THREAD_PRIORITY_LOWEST);
//ThreadUtils.SetSelfThreadPriorityWin32(ThreadUtils.WIN32_THREAD_MODE_BACKGROUND_BEGIN);
long[] seed = new long[]{1234342^(threadId*124987198651981L+215987981111L)}; long[] seed = new long[]{1234342^(threadId*124987198651981L+215987981111L)};
int[] revolvingSelector = new int[1]; int[] revolvingSelector = new int[1];
long[] logIO = new long[] {0, System.currentTimeMillis()}; long[] logIO = new long[] {0, System.currentTimeMillis()};

View File

@@ -64,6 +64,7 @@ public class CpuLayout {
} }
res[i++] = new Core((!allSameClass)&&eclz==0, new Affinity(msk, core.groupMask[0].group)); res[i++] = new Core((!allSameClass)&&eclz==0, new Affinity(msk, core.groupMask[0].group));
} }
sort(res);
return res; return res;
} }
@@ -94,10 +95,25 @@ public class CpuLayout {
} }
cores[i++] = new Core(core.getEfficiency()==0&&!allSameEfficiency, aff); cores[i++] = new Core(core.getEfficiency()==0&&!allSameEfficiency, aff);
} }
sort(cores);
return cores; return cores;
} }
private static void sort(Core[] cores) {
Arrays.sort(cores, (a,b)->{
if (a.isEfficiency == b.isEfficiency) {
int c = Short.compareUnsigned(a.affinity.group, b.affinity.group);
if (c==0) {
return Long.compareUnsigned(a.affinity.msk, b.affinity.msk);
}
return c;
} else {
return a.isEfficiency?1:-1;
}
});
}
public record Affinity(long msk, short group) {} public record Affinity(long msk, short group) {}
public record Core(boolean isEfficiency, Affinity affinity) { public record Core(boolean isEfficiency, Affinity affinity) {
@@ -115,6 +131,7 @@ public class CpuLayout {
} }
public static void main(String[] args) throws InterruptedException { public static void main(String[] args) throws InterruptedException {
System.err.println(Arrays.toString(CORES));
setThreadAffinity(CORES[0], CORES[1]); setThreadAffinity(CORES[0], CORES[1]);
for (int i = 0; i < 20; i++) { for (int i = 0; i < 20; i++) {
int finalI = i; int finalI = i;