
여러 사용자가 60코어 컴퓨팅 서버(Linux/Ubuntu 기반)에서 Java 애플리케이션을 실행하고 있습니다. 다양한 애플리케이션이 있으며 대부분 자체적으로 개발되지 않습니다.
시스템 관리자는 특정 사용자의 Java 프로세스가 특정 순간에 10개의 코어를 사용하는 것이 괜찮다고 생각하지만 10개 이상을 사용하지 않기를 원합니다.
프로세스가 컴퓨팅 리소스를 무제한으로 확보하는 것을 방지하는 데 사용할 수 있는 Java 또는 OS 구성이 있습니까?
답변1
답변2
나는 이 비디오를 볼 가치가 있다고 말하고 싶습니다.https://vimeo.com/181900266
Java, cgroup, 컨테이너에 대한 매우 유용한 개요와 JVM이 CPU 수 등을 찾는 방법을 제공합니다.
이를 바탕으로 Java 8까지 JVM은 사용 가능한 CPU 수를 결정하며, 이러한 목적으로 sysconf(_SC_NPROCESSORS_ONLN)를 사용하기 때문에 항상 모든 "온라인" CPU를 사용할 수 있다고 간주합니다. cgroup으로 지정되거나 컨테이너에 포함된 경우에도 마찬가지입니다.
Java 9부터 JVM은 sched_getaffinity()를 사용하며, cpuset을 사용하여 JVM의 CPU 수를 제어하는 경우 도움이 됩니다. 즉, JVM은 구성된 CPU만 볼 수 있습니다. 예를 들어 Docker의 cpuset-cpus 옵션을 사용하면 실제로 JVM에 대한 제한이 생성됩니다. 메모! JVM에 대해 cpushare가 구성된 경우에도 여전히 문제에 대한 솔루션을 제공하지 않습니다. CPUshare만 구성된 경우 JVM은 시스템의 모든 CPU(컨테이너에 있는지 여부에 관계 없음)를 계속 볼 수 있습니다.
답변3
다른 사람들이 언급한 것(cgroup quota, cgroup cpuset) 외에 또 다른 대안은 옵션 값을 제공하여 라이브러리가 요청할 때 보고해야 하는 CPU 수를 Java에 명시적으로 알릴 수 있다는 것입니다 -XX:ActiveProcessorCount
. 값 Runtime.getRuntime().availableProcessors()
(예: Reactor의 Schedulers.parallel()
)을 기반으로 스레드 수를 자동으로 선택하는 라이브러리는 그에 따라 자체적으로 구성됩니다. 또한 가비지 수집기의 자동 구성을 알릴 수도 있습니다.