Java:限制JVM可以使用的核心数量

多个用户在60核心计算服务器(基于Linux / Ubuntu)上运行Java应用程序。 有不同的应用程序,其中大部分不是内部开发的。

尽pipe系统pipe理员认为给定用户的Java进程在任何特定时刻都可以使用10个内核,但她希望不要超过10个。

是否有任何Java或OSconfiguration可以用来防止进程无限制地获取计算资源?

在操作系统方面:

  • 我会说古典的方法是设置CPU的亲和力与taskset

  • 更好的select是使用cgroups

  • buzz-word解决scheme是在Docker容器中运行你的应用程序。

我会说,这是值得观看这个video。 https://vimeo.com/181900266

它提供了一个非常好的关于Java与cgroups与容器的概述,以及JVM如何找出例如CPU的数量。

基于此,我认为,在Java 8之前,JVM决定可用CPU的数量,总是认为所有“在线”CPU都可用,因为它使用sysconf(_SC_NPROCESSORS_ONLN)来达到此目的。 即使是cgroup或放入一个容器。

从Java 9开始,JVM将使用sched_getaffinity(),如果使用cpuset来控制JVM的CPU数量,将会有所帮助。 即JVM将只能看到configuration的CPU。 例如,如果使用Docker的cpuset-cpus选项,那么它确实会为JVM创build一个限制。 注意! 如果为JVMconfiguration了cpushare,那么仍然不能解决问题。 如果只configuration了cpushare,JVM仍然会看到系统中的所有CPU(不pipe它是否在容器中)。