RFR: 6515172: Runtime.availableProcessors() ignores Linux taskset command
Thomas Stüfe
thomas.stuefe at gmail.com
Fri Jan 22 09:29:37 UTC 2016
On Fri, Jan 22, 2016 at 10:21 AM, Thomas Stüfe <thomas.stuefe at gmail.com>
wrote:
> Hi David,
>
> I may be doing this wrong, but I do not get this to work for me (ubuntu
> 14.4).
>
> I built hs-rt with your patch. I am running a simple loop with
> Runtime.availableProcessors(). I change affinity with taskset and would
> expect output to change, but nothing changes.
>
> java command line: ../images/jdk/bin/java -Xlog:os=trace test
> taskset command: taskset -p 0x1 <pid>
>
> Output:
>
> proc: 8
> [73,525s][trace ][os] active_processor_count: using static path -
> configured processors: 8
> [73,525s][trace ][os] active_processor_count: sched_getaffinity processor
> count: 8
> proc: 8
> ...
>
> Kind Regards, Thomas
>
>
>
I found that if I change:
if (sched_getaffinity(0, cpus_size, cpus_p) == 0) {
to
if (sched_getaffinity(getpid(), cpus_size, cpus_p) == 0) {
it works.
Manpage on sched_getaffinity() states that "If pid is zero, then the mask
of the calling process is returned." but seems that does not work.
Kind Regards, Thomas
ps. I am happy you introduced the "os" log tag, now I can use this for
AIX-specific logging without having to change shared files :-)
>
>
> On Fri, Jan 22, 2016 at 9:06 AM, David Holmes <david.holmes at oracle.com>
> wrote:
>
>> First a special thanks to Martin Buchholz for his input, feedback,
>> critique and raising awareness of how non-simple this issue is.
>>
>> bug: https://bugs.openjdk.java.net/browse/JDK-6515172
>> webrev: http://cr.openjdk.java.net/~dholmes/6515172/webrev/
>>
>> Basic problem:
>> processors available for use <= processors online <= processors
>> configured
>>
>> but we always returned the number of online processors.
>>
>> Solution is simple in its basic form: use sched_getaffinity to get the
>> scheduling affinity mask and count the number of available processors.
>>
>> Details are complicated by the desire to handle very large processor
>> systems. See the bug report for lots of detailed discussions and references.
>>
>> Testing:
>> - new test that verifies behaviour when running under taskset
>> - diagnostic hook injection (UseNewCodeN) to enable testing of all code
>> paths (one hook is left in for non-product to allow easy testing of the
>> dynamic path)
>> - JPRT
>>
>> Compatability issues:
>> - the system code we're using now is at least 5 years old so distro's
>> older than that (which are not officially supported) may not work
>> - anyone already running under a processor constrained environment (like
>> Docker) and using availableProcessor() to "size" things, will find that
>> size has now changed. We do not expect this to be a problem - on the
>> contrary we expect Docker users to want the new behaviour.
>>
>> Thanks,
>> David
>>
>
>
More information about the hotspot-runtime-dev
mailing list