有些情况下需要让JVM
认为它运行在具有N
个核心的机器上,而不是实际的核心数量(例如,4
个核心而不是16
个)。
JVM
在基于Mandriva/Red Hat Linux内核的某些Linux构建下运行。
这个问题是一个边界问题,因为我期望有各种解决此问题的方法。这不是纯粹的Linux管理问题,也不是纯粹的程序员问题。
那么...有什么想法吗?
为了让Runtime.getRuntime().availableProcessors()
返回您想要的内容,您可以使用LD_PRELOAD
技巧覆盖JVM_ActiveProcessorCount
函数。以下是一个小程序来实现这一点:
#include <stdlib.h>
#include <unistd.h>
int JVM_ActiveProcessorCount(void) {
char* val = getenv("_NUM_CPUS");
return val != NULL ? atoi(val) : sysconf(_SC_NPROCESSORS_ONLN);
}
首先,制作一个共享库:
gcc -O3 -fPIC -shared -Wl,-soname,libnumcpus.so -o libnumcpus.so numcpus.c
然后按以下方式运行Java:
$ LD_PRELOAD=/path/to/libnumcpus.so _NUM_CPUS=2 java AvailableProcessors
sysconf()
来计算编译器和GC线程的数量。但是,您可以使用-XX:CICompilerCount=n -XX:ConcGCThreads=m -XX:ParallelGCThreads=m
显式地设置JVM线程的数量。 - apanginpublic class AvailableProcessors {
public static void main(String... args) {
System.out.println(Runtime.getRuntime().availableProcessors());
}
}
如果我在家里的电脑上执行这个程序,它会打印出4
,这是实际的处理器数量(包括超线程)。现在让我们欺骗Java虚拟机,让它认为只有两个处理器:
$ echo '0-1' > /tmp/online
$ mount --bind /tmp/online /sys/devices/system/cpu/online
2
而不是4
。
man cpuset
应该会有帮助。 - Joachim Isakssonjava
jar的实时示例,那将非常好且有帮助。 - AndremoniyJVM
应该只考虑和看到4
个核心,而不是它们实际的数量。 - Andremoniy