一尘不染

欺骗JVM有关可用内核数的信息(在Linux上)

linux

出于某种目的,需要JVM考虑它在具有N核心而不是实际核心(例如4核心16)的板上运行。

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

这个问题是临界情况,因为我希望这个问题有各种解决方案。这不是纯粹的linux-administration问题,也不是纯粹的程序员问题。

所以…有什么想法吗?


阅读 202

收藏
2020-06-07

共1个答案

一尘不染

以下Java程序显示Java VM看到的处理器数量:

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上的每个进程都可以拥有自己的安装点名称空间。例如,请参见 mount(2)
手册页中的预处理名称空间部分。例如,您可以使用lxc来使用其自己的
安装名称空间 启动新进程。

2020-06-07