Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8343205

CompileBroker::possibly_add_compiler_threads excessively polls available memory

XMLWordPrintable

    • b23
    • x86_64
    • linux

        A DESCRIPTION OF THE PROBLEM :
        possibly_add_compiler_threads always fetches the free memory, before considering if a compiler thread is required, which we've observed causing performance issues with both cgroupv1 and cgroupv2 due to the frequency of polling (even with the mitigations added in JDK-8232207), particularly with large running large numbers of relatively short lived tasks on container platforms.

        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        Believe this is enough to demonstrate the correlation between compilations and calls:

        java -Xlog:os+container=trace,jit+compilation=debug
        [0.000s][trace][os,container] OSContainer::init: Initializing Container Support
        [0.000s][debug][os,container] Detected optional pids controller entry in /proc/cgroups
        [0.001s][debug][os,container] Detected cgroups v2 unified hierarchy
        [0.001s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max
        [0.001s][trace][os,container] CPU Quota is: 400000
        [0.001s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max
        [0.001s][trace][os,container] CPU Period is: 100000
        [0.001s][trace][os,container] CPU Quota count based on quota/period: 4
        [0.001s][trace][os,container] OSContainer::active_processor_count: 4
        [0.004s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 4
        [0.004s][trace][os,container] total physical memory: 790776565760
        [0.004s][trace][os,container] Path to /memory.max is /sys/fs/cgroup/memory.max
        [0.004s][trace][os,container] Memory Limit is: 8589934592
        [0.005s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 4
        [0.025s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max
        [0.025s][trace][os,container] CPU Quota is: 400000
        [0.025s][trace][os,container] Path to /cpu.max is /sys/fs/cgroup/cpu.max
        [0.025s][trace][os,container] CPU Period is: 100000
        [0.025s][trace][os,container] CPU Quota count based on quota/period: 4
        [0.025s][trace][os,container] OSContainer::active_processor_count: 4
        [0.029s][debug][jit,compilation] 1 3 java.lang.String::hashCode (60 bytes)
        [0.029s][trace][os,container ] total physical memory: 790776565760
        [0.029s][trace][os,container ] Path to /memory.max is /sys/fs/cgroup/memory.max
        [0.029s][trace][os,container ] Memory Limit is: 8589934592
        [0.029s][trace][os,container ] Path to /memory.current is /sys/fs/cgroup/memory.current
        [0.029s][trace][os,container ] Memory Usage is: 8166121472
        [0.030s][debug][jit,compilation] 2 3 java.lang.Object::<init> (1 bytes)
        [0.030s][trace][os,container ] Path to /memory.current is /sys/fs/cgroup/memory.current
        [0.030s][trace][os,container ] Memory Usage is: 8166121472
        [0.030s][debug][jit,compilation] 3 n 0 jdk.internal.misc.Unsafe::getReferenceVolatile (native)
        [0.030s][debug][jit,compilation] 4 n 0 jdk.internal.vm.Continuation::enterSpecial (native) (static)
        [0.030s][debug][jit,compilation] 5 n 0 jdk.internal.vm.Continuation::doYield (native) (static)
        [0.031s][debug][jit,compilation] 6 3 java.lang.Byte::toUnsignedInt (6 bytes)
        [0.031s][trace][os,container ] Path to /memory.current is /sys/fs/cgroup/memory.current
        [0.031s][trace][os,container ] Memory Usage is: 8166383616
        [0.032s][debug][jit,compilation] 7 3 java.lang.String::coder (15 bytes)
        [0.032s][trace][os,container ] Path to /memory.current is /sys/fs/cgroup/memory.current
        [0.032s][trace][os,container ] Memory Usage is: 8166383616
        [0.032s][debug][jit,compilation] 10 3 java.lang.String::isLatin1 (19 bytes)
        [0.032s][trace][os,container ] Path to /memory.current is /sys/fs/cgroup/memory.current
        [0.032s][trace][os,container ] Memory Usage is: 8166383616
        [0.032s][debug][jit,compilation] 8 3 jdk.internal.util.Preconditions::checkIndex (18 bytes)
        [0.032s][trace][os,container ] Path to /memory.current is /sys/fs/cgroup/memory.current
        [0.032s][trace][os,container ] Memory Usage is: 8166383616
        [0.032s][debug][jit,compilation] 9 3 java.lang.String::charAt (25 bytes)
        [0.032s][trace][os,container ] Path to /memory.current is /sys/fs/cgroup/memory.current
        [0.032s][trace][os,container ] Memory Usage is: 8166383616
        [0.032s][debug][jit,compilation] 11 n 0 java.lang.Object::hashCode (native)
        [0.032s][debug][jit,compilation] 12 n 0 java.lang.invoke.MethodHandle::linkToStatic(LLLLLLL)L (native) (static)
        [0.033s][debug][jit,compilation] 13 1 java.lang.Enum::ordinal (5 bytes)
        [0.033s][trace][os,container ] Path to /memory.current is /sys/fs/cgroup/memory.current
        [0.033s][trace][os,container ] Memory Usage is: 8166383616


        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        Free memory is only considered if a thread would otherwise be added.
        ACTUAL -
        Free memory is considered for each compiler loop iteration.

        CUSTOMER SUBMITTED WORKAROUND :
        Configure -XX:-UseDynamicNumberOfCompilerThreads

        FREQUENCY : often


              mdoerr Martin Doerr
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              7 Start watching this issue

                Created:
                Updated:
                Resolved: