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