首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >欺骗JVM关于可用内核的数量(在linux上)

欺骗JVM关于可用内核的数量(在linux上)
EN

Stack Overflow用户
提问于 2014-03-30 08:25:45
回答 2查看 4.5K关注 0票数 13

在某种意义上,需要让JVM思考一下,它运行在机器上,机上有N核,而不是实际数量的核心(例如,4核而不是16)。

JVM运行在一些基于Mandriva/Red内核的Linux构建下。

这个问题是一个边缘问题,因为我期待这个问题的各种解决方案。这不是纯粹的linux管理问题,也不是程序员的问题。

所以..。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-30 18:22:37

下面的Java程序打印Java所看到的处理器数量:

代码语言:javascript
复制
public class AvailableProcessors {
    public static void main(String... args) {
        System.out.println(Runtime.getRuntime().availableProcessors());
    }
}

如果我在我的家用计算机上执行这个程序,它会打印4,这是核的实际数量(包括超线程)。现在,让我们让Java VM相信只有两个处理器:

代码语言:javascript
复制
$ echo '0-1' > /tmp/online
$ mount --bind /tmp/online /sys/devices/system/cpu/online

如果我再次运行上面的程序,它会打印2而不是4

此技巧影响系统上的所有进程。然而,这是可能的,仅限于某些过程的影响。Linux上的每个进程都可以有自己的挂载点名称空间。例如,请参见挂载(2)手册页中的预处理命名空间部分。例如,您可以使用lxc启动具有自己的挂载命名空间的新进程。

票数 6
EN

Stack Overflow用户

发布于 2014-03-31 13:16:16

为了使Runtime.getRuntime().availableProcessors()返回您想要的任何内容,您可以使用LD_PRELOAD技巧覆盖JVM_ActiveProcessorCount函数。下面是一个很小的程序来完成这个任务:

代码语言:javascript
复制
#include <stdlib.h>
#include <unistd.h>

int JVM_ActiveProcessorCount(void) {
    char* val = getenv("_NUM_CPUS");
    return val != NULL ? atoi(val) : sysconf(_SC_NPROCESSORS_ONLN);
}

首先,创建一个共享库:

代码语言:javascript
复制
gcc -O3 -fPIC -shared -Wl,-soname,libnumcpus.so -o libnumcpus.so numcpus.c

然后按以下方式运行Java:

代码语言:javascript
复制
$ LD_PRELOAD=/path/to/libnumcpus.so _NUM_CPUS=2 java AvailableProcessors
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22741859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档