You will demonstrate how to harden your pal-tracker application
running on Tanzu Application Service for scaling and availability
characteristics.
After completing the lab, you will be able to:
Tune your application for disposability.
Tune your application to run optimally in a container
You must have completed (or fast-forwarded to) the
Health Monitoring lab.
You must have your pal-tracker application associated with the
actuator-solution codebase deployed and running on
Tanzu Application Service.
In a terminal window,
make sure you start in the ~/workspace/pal-tracker directory.
Cherry-pick the start point of this lab:
git cherry-pick scaling-availability-start
Note:
You will likely receive a git merge conflict message after
executing the cherry-pick,
either on the route you defined,
or the JBP_CONFIG_OPEN_JDK_JRE environment variable change
with the explicit memory_calcuator stack_threads configuration,
or with the YAML indentation.
Make sure to clean the up the merge conflicts,
and pick the updated JBP_CONFIG_OPEN_JDK_JRE configuration.
After that,
stage your change and complete the cherry-pick operation:
git add manifest.yml
git cherry-pick --continue
This will pull in updates for the following:
pal-tracker manifest file with the desired initial state of
your app.Ensure you have the latest code built on your local machine
that includes all the updates from the previous labs,
or as of the actuator-solution point:
./gradlew clean build
Assuming you are running pal-tracker now,
delete it:
cf delete pal-tracker -f
You will push it with the desired start configuration later in the lab.
In this lab you will exercise your pal-tracker application under load,
monitor it,
and tune it.
You can monitor the pal-tracker application through the following:
Command line via the following cf commands:
cf app pal-trackercf events pal-trackerApps Manager user interface.
If you choose to monitor via the command line you will need a minimum of four terminal windows open.
If you choose to monitor with Apps Manager you will need only one.
Review the pal-tracker manifest file.
git show scaling-availability-start:manifest.yml
Notice the new parameters added, they reflect the defaults the Tanzu Application Service sets on your behalf:
java_buildpack_offline:
Given that the pal-tracker app is a Java app,
this buildpack is the one that would automatically be detected and
used to build the app’s droplet.
From here on, it is explicitly set in the manifest, which will
speed up the staging process.
stack:
cflinuxfs3 is the default Linux file system stack from which the
droplet and associated containers will derive.
memory:
1G is the default container memory allocation quota.
This is not the Java heap size.
You will see shortly the Memory Calculator will configure your
Java options for you automatically.
disk_quota:
1G is the default allocated disk quota.
instances:
1 is the default number of pal-tracker app instances and
associated containers.
health-check-type:
port is the default mode of Diego to check the health of the
pal-tracker application.
Diego will attempt to connect to the pal-tracker application on
port 8080.
timeout:
60 seconds is the default time interval that Diego will wait for
the health check to succeed on start up before giving up and
retrying.
JBP_CONFIG_OPEN_JDK_JRE:
'{ jre: { version: 11.+ }, memory_calculator: { stack_threads: 250 } }'
is the environment variable that sets the buildpack Java version,
and optionally
memory calculator
tuning.
The stack_threads value of 250 is the default.
MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE environment variable is
set for you.
This is added to expose the default and palTrackerFailure actuator
endpoint you will use in this lab.
You can see the entire list of Tanzu Application Service manifest attributes.
Push your pal-tracker application.
cf push
Wait for your app to complete startup:
name: pal-tracker
requested state: started
...
...
state since cpu memory disk details
#0 running 2020-12-01T00:42:33Z 0.0% 0 of 1G 0 of 1G
For the remainder of the lab you will monitor the state of the
pal-tracker application.
You can navigate to the pal-tracker application overview page in
Apps Manager,
or you can monitor from command line:
In a separate terminal window, run the following command,
watch cf app pal-tracker
You will see in the later instructions this is referred to as the
cf app watch window.
In a separate terminal window,
run a watch for pal-tracker events:
watch cf events pal-tracker
Notice that the events are ordered from the most recent at the top to the oldest at the bottom.
You will see in the later instructions this is referred to as the
cf events watch window.
Keep both these windows open and running for the rest of the lab.
After the application completes its startup, review the logs since startup:
cf logs pal-tracker --recent
Review the time stamp of the line that contains the following message:
Starting health monitoring of container
It should look something like:
2020-11-30T18:42:26.37-0600 [CELL/0] OUT Starting health monitoring of container
Review the time stamp of the line that contains the following message:
Container became healthy
It should look something like:
2020-11-30T18:42:33.06-0600 [CELL/0] OUT Container became healthy
What is the elapsed time it took for the health monitoring to start,
and when Diego cell detected the healthy pal-tracker application
instance?
Dedicate one of your open terminal windows to run some load against
your application.
You will use the
docker-loadtest
tool as follows,
using your review environment url you configured in your manifest:
docker run -i -t --rm -e DURATION=300 -e NUM_USERS=10 -e REQUESTS_PER_SECOND=5 -e URL=http://pal-tracker-${UNIQUE_IDENTIFIER}.${DOMAIN} pivotaleducation/loadtest
where the
NUM_USERS option value is number of simulated users/threadsDURATION option value is the max duration of the test
(seconds)REQUESTS_PER_SECOND option value is the number of requests per
second.In either Apps Manager or the cf app Watch window,
monitor the amount of CPU, memory and disk resources taken for the
test.
Let your load test complete,
or terminate it by Ctrl+C.
Based on what you have seen with your pal-tracker application so far,
is it optimally tuned for production?
Are the resources allocated by the pal-tracker instance really
needed?
Can you perhaps tune down the memory and disk resources allocated
to the pal-tracker application instance?
Is the 60-second startup interval really needed by Diego based on
the startup time characteristic of the pal-tracker application?
Can you perhaps tune it down,
such that a misbehaving pal-tracker instance can fail faster for
better
disposability
characteristics?
Do you have enough instances to make your pal-tracker application
available?
What if a platform operator is doing daily planned maintenance that
would take down the cell in which your application instance is
running?
What if your application instance crashes?
How many instances should you run at a minimum to
account for concurrent planned and unplanned outage of individual
instances?
Is the port health check optimal for a request/response (blocking)
Java web application?
What if your pal-tracker application stalls on Java garbage
collection?
What if it runs out of threads?
What type of health check would be optimal,
and which Spring Boot Actuator feature could you use for that
health check?
What about CPU resources? How does Tanzu Application Service handle that?
You will now configure your application to improve its production characteristics.
Configure the following in the manifest.yml file:
Configure the disk quota for 256M.
Configure the memory quota for 512M.
Configure the JBP_CONFIG_OPEN_JDK_JRE environment variable,
memory_calculator → stack_threads to 100.
The app will not start with the container memory quota reduced to 512M and the default stack thread configuration.
Configure 3 instances.
Configure a http health check type:
health-check-type from port to httphealth-check-http-endpoint with
a value configured to the associated endpoint of the
pal-tracker Spring Boot application’s liveness probe endpoint.MANAGEMENT_HEALTH_PROBES_ENABLED environment
variable with a value of true to enable the liveness probe.Tune down the startup health check timeout to roughly twice
the start up time of your pal-tracker application that you
measured in the
Startup time section
step 4 (and round up to next 10 second interval).
Push your updated configuration:
cf push
Wait until all the pal-tracker instances start.
If you get stuck, you can look at the solution here:
git show scaling-availability-solution:manifest.yml
Notice that you are not configuring CPU resource allocation. Read about how Tanzu Application Service works with CPU.
Review the Scaling slides about how scaling is handled on Tanzu Application Service.
Now that you have completed the lab, you should be able to:
Tune your application for disposability.
Tune your application to run optimally in a container.