Java: Limite o número de núcleos que uma JVM pode usar

6

Vários usuários estão executando aplicativos java em um servidor de computação de 60 núcleos (baseado em Linux / Ubuntu). Existem diferentes aplicações e a maioria delas não é desenvolvida internamente.

Enquanto o sysadmin acha que não há problema em o processo Java de um determinado usuário usar 10 núcleos em um dado momento, ela gostaria que eles não usassem mais de 10.

Existe alguma configuração Java ou OS que possa ser usada para evitar que o processo simplesmente capture recursos de computação de maneira ilimitada?

    
por oggotron 12.06.2015 / 17:10

2 respostas

3

Na frente do sistema operacional:

  • Eu diria que o método clássico é definir a afinidade de CPU com taskset .

  • Uma alternativa melhor é usar cgroups .

  • E a solução de palavras da moda é executar seus aplicativos em contêineres Docker . No entanto, antes do Java 8, a JVM não consegue entender as limitações impostas pelo Docker (disponível somente após o 8u131 + backported, não tendo certeza se está disponível como experimental em Java9 para a parte da CPU, mas é para memória e totalmente disponível em Java10)

por 12.06.2015 / 17:38
2

Eu diria que vale a pena ver este vídeo. link

Ele fornece uma visão geral muito boa sobre Java vs. cgroups vs. containers e como a JVM descobre, por exemplo, o número de CPUs.

Com base nisso, eu diria que, até o Java 8, a JVM determina o número de CPUs disponíveis, sempre considerando que todas as CPUs "online" estão disponíveis para ele, porque ele usa o sysconf (_SC_NPROCESSORS_ONLN) para este propósito. Mesmo se for cgroup'd ou colocado em um container.

No Java 9, a JVM usará sched_getaffinity () e ajudará se o cpuset for usado para controlar o número de CPUs para a JVM. Ou seja a JVM verá apenas as CPUs configuradas. Por exemplo, se alguém usar a opção cpuset-cpus do Docker, ela realmente criará um limite para a JVM. Nota! Se o cpushare estiver configurado para a JVM, isso ainda não fornecerá uma solução para o problema. A JVM ainda verá todas as CPUs no sistema (não importa se está em um contêiner) se apenas o cpushare estiver configurado.

    
por 02.02.2017 / 14:35