gcc -shared -fPIC fake-cpu-count.c -o fake-cpu-count.so -ldl
javac ReportCpuCount.java
java -cp . ReportCpuCount
#Found 8 CPUs
#...
LD_PRELOAD=./fake-cpu-count.so java -cp . ReportCpuCount
#Found 2 CPUs
#...
| #define _GNU_SOURCE | |
| #include "stdlib.h" | |
| #include <unistd.h> | |
| #include <dlfcn.h> | |
| typedef long int (*orig_sysconf_f_type)(int __name); | |
| long sysconf(int name){ | |
| orig_sysconf_f_type orig_sysconf; | |
| orig_sysconf = (orig_sysconf_f_type)dlsym(RTLD_NEXT,"sysconf"); | |
| if (name == _SC_NPROCESSORS_CONF){ | |
| return 3; | |
| } | |
| return orig_sysconf(name); | |
| } |
| #define _GNU_SOURCE | |
| #include "stdlib.h" | |
| #include <unistd.h> | |
| #include <dlfcn.h> | |
| typedef long int (*orig_sysconf_f_type)(int __name); | |
| long sysconf(int name){ | |
| orig_sysconf_f_type orig_sysconf; | |
| orig_sysconf = (orig_sysconf_f_type)dlsym(RTLD_NEXT,"sysconf"); | |
| if (name == _SC_NPROCESSORS_CONF){ | |
| return 2; | |
| } | |
| return orig_sysconf(name); | |
| } |
| #define _GNU_SOURCE | |
| #include "stdlib.h" | |
| #include <unistd.h> | |
| #include <dlfcn.h> | |
| typedef long int (*orig_sysconf_f_type)(int __name); | |
| long sysconf(int name){ | |
| orig_sysconf_f_type orig_sysconf; | |
| orig_sysconf = (orig_sysconf_f_type)dlsym(RTLD_NEXT,"sysconf"); | |
| if (name == _SC_NPROCESSORS_ONLN){ | |
| return 2; | |
| } | |
| return orig_sysconf(name); | |
| } |
| public class ReportCpuCount { | |
| public static void main(String[] args) throws Exception{ | |
| while(true){ | |
| System.out.printf("#Found %d CPUs%n", Runtime.getRuntime().availableProcessors()); | |
| Thread.sleep(1000); | |
| } | |
| } | |
| } |
| Java(TM) SE Runtime Environment (build 1.7.0_80-b15) | |
| Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode) | |
| java only : #Found 4 CPUs | |
| NPROCESSORS_CONF: #Found 4 CPUs | |
| NPROCESSORS_ONLN: #Found 2 CPUs <-- runtime.availableProcessors() returns sysconf(_SC_NPROCESSORS_ONLN) | |
| taskset -c 0 : #Found 4 CPUs | |
| Java(TM) SE Runtime Environment (build 1.8.0_121-b13) | |
| Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) | |
| java only : #Found 4 CPUs | |
| NPROCESSORS_CONF: #Found 4 CPUs | |
| NPROCESSORS_ONLN: #Found 2 CPUs <-- runtime.availableProcessors() returns sysconf(_SC_NPROCESSORS_ONLN) | |
| taskset -c 0 : #Found 4 CPUs | |
| Java(TM) SE Runtime Environment (build 1.8.0_131-b11) | |
| Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) | |
| java only : #Found 4 CPUs | |
| NPROCESSORS_CONF: #Found 3 CPUs <-- runtime.availableProcessors() returns sysconf(_SC_NPROCESSORS_CONF) | |
| NPROCESSORS_ONLN: #Found 4 CPUs | |
| taskset -c 0 : #Found 1 CPUs <-- runtime.availableProcessors() returns the specified CPU affinity | |
| Java(TM) SE Runtime Environment (build 9-ea+165) | |
| Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode) | |
| java only : #Found 4 CPUs | |
| NPROCESSORS_CONF: #Found 4 CPUs <-- runtime.availableProcessors() ignores returns sysconf(_SC_NPROCESSORS_[CONF|ONLN]) | |
| NPROCESSORS_ONLN: #Found 4 CPUs <-/ | |
| taskset -c 0 : #Found 1 CPUs <-- runtime.availableProcessors() returns the specified CPU affinity |
| #!/bin/sh | |
| # a bug report adressing the behaviour of the configured CPU affinity | |
| # | |
| # https://bugs.openjdk.java.net/browse/JDK-6515172 | |
| # the relevant code in Java 8 / 9 | |
| # | |
| # http://hg.openjdk.java.net/jdk9/jdk9/hotspot/file/443a768ec827/src/os/linux/vm/os_linux.cpp | |
| # http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/os/linux/vm/os_linux.cpp | |
| JAVA_HOMES=/opt/jdks | |
| PATH_ORIG=${PATH} | |
| for jdk in jdk1.7.0_80 jdk1.8.0_121 jdk1.8.0_131 jdk1.9.0.ea.165 | |
| do | |
| export PATH=${JAVA_HOMES}/${jdk}/bin:${PATH_ORIG} | |
| javac ReportCpuCount.java | |
| java -version 2>&1 | tail -2 | |
| printf "java only : " | |
| java -cp . ReportCpuCount | |
| printf "NPROCESSORS_CONF: " | |
| gcc -shared -fPIC fake-cpu-conf.c -o fake-cpu-conf.so -ldl | |
| LD_PRELOAD=./fake-cpu-conf.so java -cp . ReportCpuCount | |
| printf "NPROCESSORS_ONLN: " | |
| gcc -shared -fPIC fake-cpu-onln.c -o fake-cpu-onln.so -ldl | |
| LD_PRELOAD=./fake-cpu-onln.so java -cp . ReportCpuCount | |
| printf "taskset -c 0 : " | |
| taskset -c 0 java -cp . ReportCpuCount | |
| echo | |
| done |
Thank you!