lhotari commented on issue #7859:
URL: https://github.com/apache/pulsar/issues/7859#issuecomment-686272487


   > Java 8 and Docker doesn't work that well together. Some things got 
backported to Java 8 but only Java 10+ supports Memory and CPU limits inside 
Docker Containers correctly.
   
   This has changed in the last 2 years. The Java 8 version used in Pulsar 
images already supports container memory & cpu limits. [This blog post explains 
it](https://blog.softwaremill.com/docker-support-in-new-java-8-finally-fd595df0ca54).
   
   One way to verify that it's supported is to run this docker command:
   ```
   docker run --memory 100m --cpus 1 --rm --entrypoint '/bin/bash' 
apachepulsar/pulsar:2.6.1 -c 'java -XX:+UnlockDiagnosticVMOptions 
-XX:+PrintContainerInfo -version'
   ```
   it will printout diagnostics about the limits that the JVM detects:
   ```
   OSContainer::init: Initializing Container Support
   Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/memory.limit_in_bytes
   Memory Limit is: 104857600
   Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us
   CPU Quota is: 100000
   Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us
   CPU Period is: 100000
   Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares
   CPU Shares is: 1024
   CPU Quota count based on quota/period: 1
   OSContainer::active_processor_count: 1
   ```
   
   It's already possible to use the JVM container support in Pulsar containers 
by specifying `PULSAR_MEM="-XX:InitialRAMPercentage=50.0 
-XX:MaxRAMPercentage=50.0 -XX:MinRAMPercentage=50.0"`. 
   
   For example:
   ```
   docker run --name pulsar-standalone --memory 512m --cpus 1 -e 
PULSAR_MEM="-XX:InitialRAMPercentage=50.0 -XX:MaxRAMPercentage=50.0 
-XX:MinRAMPercentage=50.0" -e PULSAR_GC="-XX:+UseG1GC" 
apachepulsar/pulsar:2.6.1 bin/pulsar standalone
   ```
   
   Verifying in another terminal after startup:
   ```
   $ docker exec pulsar-standalone jcmd 1 GC.heap_info 
   1:
    garbage-first heap   total 262144K, used 146496K [0x00000000f0000000, 
0x00000000f0100800, 0x0000000100000000)
     region size 1024K, 75 young (76800K), 7 survivors (7168K)
    Metaspace       used 78433K, capacity 82292K, committed 82460K, reserved 
1122304K
     class space    used 9461K, capacity 10287K, committed 10316K, reserved 
1048576K
   ```
   Heap size is 256MB, which is expected. Since Pulsar uses also native memory, 
it's probably not worth increasing the heap limit too much over 50% so that the 
container doesn't get killed. The [default MaxDirectMemorySize is the maximum 
heap size](https://stackoverflow.com/a/54447744). The [total memory consumption 
of a Java process is explained here](https://stackoverflow.com/a/53624438).
   It's also worth noticing that PULSAR_GC should be set for docker containers 
so that the not-so-good defaults don't get used. [There's a PR already for 
addressing this issue](https://github.com/apache/pulsar/pull/3650). One issue 
with the defaults is that there's a huge number of GC threads configured.
   
   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to