Cloud Profiler allows you to continuously profile CPU and heap usages to help identify performance bottlenecks and critical paths in your application. It'll be able to produce flame graph on which parts of your application uses the most CPU and/or Heap.
Enable API
gcloudservicesenablecloudprofiler.googleapis.com
CPU Time
The CPU time for a function tells you how long the CPU was busy executing instructions. It doesn't include the time the CPU was waiting or processing instructions for something else.
Wall Time
The wall-clock time for a function measures the time elapsed between entering and exiting a function. Wall-clock time includes all wait time, including that for locks and thread synchronization. If the wall-clock time is significantly longer than the CPU time, then that is an indication the code spends a lot of time waiting. This might be an indication of a resource bottleneck.
Heap
The heap consumption is the amount of memory allocated in the Java program's heap - this can help you find potential inefficiencies and memory leaks in your application.
Java Agent
Cloud Profiler works by adding a Java agent to your JVM startup argument, and the agent can communicate with the Cloud Profiler service in the Cloud. Through the Cloud Console, you can then see the collected profile data.
Agent Files
A Cloud Profiler agent can work both within Google Cloud environments using the Machine Credentials, and outside of Google Cloud environments (e.g., on-premises, and in another cloud) using a Service Account key file.
Unfortunately, the list of versions are not available on GitHub. The only way to see the list of available versions is listing the Google Cloud Storage bucket that contains all the binaries:
You can specify additional Agent configurations within the same agentpath argument, in the form of java -agentpath:/opt/cprof/profiler_java_agent.so=FLAG1=VALUE1,FLAG2=VALUE2.
Heap sampling is only available in Java 11 and higher. To turn on both CPU and Heap profiling for a Java 11 application:
By default the Cloud Profiler does not output any logs. You can turn on logging by using -logtostderrflag, and configure the log level using ‑minloglevelflag.
Cloud Profiler agent is already present in your App Engine application. However, it is not on by default. You can turn it on by using the JAVA_TOOL_OPTIONS environmental variable in an app.yaml file:
It'll take a couple of minutes before Cloud Profiler can display the information. In Cloud Profiler console, you can find the Default service in the drop down:
Add the Cloud Profiler Java agent to the container, and configure the agent in the startup command line.
Clone
# Clone the sample repository manuallygitclonehttps://github.com/saturnism/jvm-helloworld-by-examplecdjvm-helloworld-by-example/helloworld-springboot-tomcat
Containerize with a Dockerfile
In the Dockerfile, download the Cloud Debugger and build it as part of the container image:
Dockerfile
FROM openjdk:11
# Create a directory for the Profiler. Add and unzip the agent in the directory.
RUN mkdir -p /opt/cprof && \
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
| tar xzv -C /opt/cprof
COPY target/helloworld.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
Download the Cloud Debugger Java agent into src/main/jib directory so that Jib can include the agent files as part of the container image:
# Make a directory to store the Java agentmkdir-psrc/main/jib/opt/cprof# Download and extract the Java agent to the directorywget-qO-https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz| \tarxvz-Csrc/main/jib/opt/cprof
In Cloud Profiler console, you can see the helloworld service in the drop down:
Add the Cloud Profiler Java agent to the container, and configure the agent in the startup command line.
Clone
# Clone the sample repository manuallygitclonehttps://github.com/saturnism/jvm-helloworld-by-examplecdjvm-helloworld-by-example/helloworld-springboot-tomcat
Containerize with a Dockerfile
In the Dockerfile, download the Cloud Debugger and build it as part of the container image:
Dockerfile
FROM openjdk:11
# Create a directory for the Profiler. Add and unzip the agent in the directory.
RUN mkdir -p /opt/cprof && \
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
| tar xzv -C /opt/cprof
COPY target/helloworld.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
Download the Cloud Debugger Java agent into src/main/jib directory so that Jib can include the agent files as part of the container image:
# Make a directory to store the Java agentmkdir-psrc/main/jib/opt/cprof# Download and extract the Java agent to the directorywget-qO-https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz| \tarxvz-Csrc/main/jib/opt/cprof
In Cloud Debugger console, you can see the helloworld-gce service in the drop down:
You can attach the Cloud Debugger agent to any Java application even if it runs outside of the Google Cloud environment (whether it's in a container, or on your local laptop, or in another cloud). Authentication has to be done using Service Account key file rather than using the Machine Credentials.
This only works on a Linux x86 based system.
Clone
# Clone the sample repository manuallygitclonehttps://github.com/saturnism/jvm-helloworld-by-examplecdjvm-helloworld-by-example/helloworld-springboot-tomcat