在某种意义上,需要让JVM思考一下,它运行在机器上,机上有N核,而不是实际数量的核心(例如,4核而不是16)。
JVM运行在一些基于Mandriva/Red内核的Linux构建下。
这个问题是一个边缘问题,因为我期待这个问题的各种解决方案。这不是纯粹的linux管理问题,也不是程序员的问题。
所以..。有什么想法吗?
发布于 2014-03-30 18:22:37
下面的Java程序打印Java所看到的处理器数量:
public class AvailableProcessors {
public static void main(String... args) {
System.out.println(Runtime.getRuntime().availableProcessors());
}
}如果我在我的家用计算机上执行这个程序,它会打印4,这是核的实际数量(包括超线程)。现在,让我们让Java VM相信只有两个处理器:
$ echo '0-1' > /tmp/online
$ mount --bind /tmp/online /sys/devices/system/cpu/online如果我再次运行上面的程序,它会打印2而不是4。
此技巧影响系统上的所有进程。然而,这是可能的,仅限于某些过程的影响。Linux上的每个进程都可以有自己的挂载点名称空间。例如,请参见挂载(2)手册页中的预处理命名空间部分。例如,您可以使用lxc启动具有自己的挂载命名空间的新进程。
发布于 2014-03-31 13:16:16
为了使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 AvailableProcessorshttps://stackoverflow.com/questions/22741859
复制相似问题