Effect of setting CPU quota on Java performance

Ioi Lam ioi.lam at oracle.com
Mon Feb 5 18:12:16 UTC 2018


As a control test, maybe you can run a simple multi-threaded C benchmark with the same settings?

> On Feb 5, 2018, at 1:48 PM, Ashutosh Mehra1 <asmehra1 at in.ibm.com> wrote:
> 
> I have been trying to understand if setting CPU quota limit on a docker 
> container, provided the "effective" CPUs are the same, has any impact on 
> the application performance.
> As an example, if my app is running on 4 CPUs @ 100% quota, would I get 
> same performance if my app is running on 8 CPUs at 50% quota? Note that 
> "effective" CPUs is 4 in both cases.
> 
> Since OpenJDK early access builds for Java 10 have improved support for 
> docker container (https://bugs.openjdk.java.net/browse/JDK-8146115), I 
> decided to do some measurements using that build.
> I got the build OpenJDK build jdk-10-ea+40 from http://jdk.java.net/10/. 
> This build by default has container support enabled.
> The system I used has 32 CPUs including 2 hyperthreads per core. I turned 
> off hyperthreading for this experiment. That leaves me with 16 cores on 2 
> sockets: 0-7 on 1 socket and 8-15 on 2nd socket.
> System details are:
> 
> # lsb_release -a
> No LSB modules are available.
> Distributor ID:          Ubuntu
> Description:             Ubuntu 16.04.2 LTS
> Release:                 16.04
> Codename:                xenial
> 
> # uname -r
> 4.4.0-103-generic
> 
> For measurements I used AcmeAir benchmark at 
> https://github.com/sabkrish/acmeair/tree/microservice_changes.
> I ran the AcmeAir benchmark with the said build for following cases:
> 
> 1) Ran AcmeAir with JVM bound to 4 cpus (8-11) and no limit on quota. Lets 
> call this 4CPU at 100.
> This used following JVM settings:
> CICompilerCount = 3, ParallelGCThreads = 4, ConcGCThreads = 1
> 
> 2) Case 8Cpu50Quota: Ran AcmeAir with JVM bound to 8 cpus (8-15) and 50% 
> quota. Lets call this 8CPU at 50.
> In this case container support was enabled by default and it used 
> following JVM settings:
> CICompilerCount = 3, ParallelGCThreads = 4, ConcGCThreads = 1
> 
> 3) Ran AcmeAir with JVM bound to 8 cpus (8-15) and 50% quota with 
> -XX:-UseContainerSupport option to disable container support. Lets call 
> this 8CPU at 50NoCS.
> This used following JVM settings:
> CICompilerCount = 4, ParallelGCThreads = 8, ConcGCThreads = 2
> 
> Load on the server was applied using JMeter which was running on same box 
> but bound to 0-8 CPUs. I applied the load for few minutes to warm up the 
> JVM before starting the final "measure" run.
> Throughput reported below is for the final "measure" run. All numbers 
> reported below are an average of 10 iterations.
> 
> Throughput result:
> 4Cpu1 at 100  |  8Cpu at 50 |  8Cpu at 50NoCS
> 9621.5            |  6970.6      |  7252.1
> 
> I also measured Total compilation time (in seconds) and Total pause time 
> (in seconds) for the duration of the server (which includes warm up 
> phase):
> 
> Compilation time:
> 4Cpu1 at 100  |  8Cpu at 50  |  8Cpu at 50NoCS
> 79.8545          |  76.7041     |  100.085
> 
> GC Pasue time:
> 4Cpu1 at 100  |  8Cpu at 50  |  8Cpu at 50NoCS
> 1.829              |  1.886         |  1.927
> 
> I am quite surprised to see the drop in throughput between 4Cpu100Quota 
> and 8Cpu50Quota case.
> Looking deeper into the results, I do notice that numbers for 8Cpu50Quota 
> case were not very consistent, but in general I can say they are not 
> matching 4Cpu100Quota case.
> I will be doing additional runs for this setup (and on different OS/kernel 
> version) and increase warm up time for the JVM to see if that improves the 
> consistency.
> 
> Meanwhile, couple of questions I wanted to put forward:
> 1) Has anyone else noticed this kind of difference in Java 
> application/JVM performance when CPU quota is used?
> 2) What other open-source benchmarks are available that I can use to 
> verify the behavior I am observing?
> 
> Any comments/feedback are welcome.
> 
> Thanks,
> Ashutosh Mehra
> 



More information about the jdk-dev mailing list