README.provisioning-parameters.md
Keycloak Performance Testsuite - Provisioning Parameters
Overview of Provisioned Services
Testing
| Deployment | Keycloak Server | Database | Load Balancer | Infinispan Server | |-----------------|------------------------------------------|--------------------|--------------------|--------------------| | Singlenode | 1 instance | 1 instance | - | - | | Cluster | N instances | 1 instance | 1 instance | - | | Cross-DC | K instances in DC1 + L instances in DC2 | 1 instance per DC | 1 instance per DC | 1 instance per DC |
Monitoring
| Deployment | CAdvisor | Influx DB | Grafana | |-----------------|-------------|-------------|-------------| | Monitoring | 1 instance | 1 instance | 1 instance |
Service Parameters
Keycloak Server
| Category    | Setting                       | Property                           | Default Value                                                      |
|-------------|-------------------------------|------------------------------------|--------------------------------------------------------------------|
| Scaling[1] | Scale for cluster   | keycloak.scale                   | Maximum size[2] of cluster.                             |
|             | Scale for DC1                 | keycloak.dc1.scale               | Maximum size of DC1.                                               |
|             | Scale for DC2                 | keycloak.dc2.scale               | Maximum size of DC2.                                               |
| Docker      | Allocated CPUs                | keycloak.docker.cpusets          | 2-3 for singlenode, 2 3 for cluster deployment                 |
|             | Allocated CPUs for DC1        | keycloak.dc1.docker.cpusets      | 2                                                                |
|             | Allocated CPUs for DC2        | keycloak.dc2.docker.cpusets      | 3                                                                |
|             | Available memory              | keycloak.docker.memlimit         | 2500m                                                            |
| JVM         | Memory settings               | keycloak.jvm.memory              | -Xms64m -Xmx2g -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m   |
| Undertow    | HTTP Listener max connections | keycloak.http.max-connections    | 50000                                                            |
|             | AJP Listener max connections  | keycloak.ajp.max-connections     | 50000                                                            |
| IO          | Worker IO thread pool         | keycloak.worker.io-threads       | 2                                                                |
|             | Worker Task thread pool       | keycloak.worker.task-max-threads | 16                                                               |
| Datasources | Connection pool min size      | keycloak.ds.min-pool-size        | 10                                                               |
|             | Connection pool max size      | keycloak.ds.max-pool-size        | 100                                                              |
|             | Connection pool prefill       | keycloak.ds.pool-prefill         | true                                                             |
|             | Prepared statement cache size | keycloak.ds.ps-cache-size        | 100                                                              |
[ 1 ] The scaling parameters are optional. They can be set within interval from 1 to the maximum cluster size]. If not set they are automatically set to the maximum size of the cluster (DC1/DC2 respectively).
[ 2 ] Maximum cluster size is determined by provisioner-specific parameter such as keycloak.docker.cpusets for the default docker-compose provisioner.
The maximum cluster size corresponds to the number of cpusets.
Database
| Category    | Setting                       | Property                           | Default Value                                                      |
|-------------|-------------------------------|------------------------------------|--------------------------------------------------------------------|
| Docker      | Allocated CPUs                | db.docker.cpusets                | 1                                                                |
|             | Allocated CPUs for DC1        | db.dc1.docker.cpusets            | 1                                                                |
|             | Allocated CPUs for DC2        | db.dc2.docker.cpusets            | 1                                                                |
|             | Available memory              | db.docker.memlimit               | 2g                                                               |
Load Balancer
| Category    | Setting                       | Property                     | Default Value                                                      |
|-------------|-------------------------------|------------------------------|--------------------------------------------------------------------|
| Docker      | Allocated CPUs                | lb.docker.cpusets          | 1                                                                |
|             | Allocated CPUs for DC1        | lb.dc1.docker.cpusets      | 1                                                                |
|             | Allocated CPUs for DC2        | lb.dc2.docker.cpusets      | 1                                                                |
|             | Available memory              | lb.docker.memlimit         | 1g                                                               |
| JVM         | Memory settings               | lb.jvm.memory              | -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m |
| Undertow    | HTTP Listener max connections | lb.http.max-connections    | 50000                                                            |
| IO          | Worker IO thread pool         | lb.worker.io-threads       | 2                                                                |
|             | Worker Task thread pool       | lb.worker.task-max-threads | 16                                                               |
Infinispan Server
| Category    | Setting                       | Property                        | Default Value                                                                             |
|-------------|-------------------------------|---------------------------------|-------------------------------------------------------------------------------------------|
| Docker      | Allocated CPUs for DC1        | infinispan.dc1.docker.cpusets | 1                                                                                       |
|             | Allocated CPUs for DC2        | infinispan.dc2.docker.cpusets | 1                                                                                       |
|             | Available memory              | infinispan.docker.memlimit    | 1500m                                                                                   |
| JVM         | Memory settings               | infinispan.jvm.memory         | -Xms64m -Xmx1g -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -XX:+DisableExplicitGC   |
Monitoring
| Category    | Setting                       | Property                    | Default Value   |
|-------------|-------------------------------|-----------------------------|-----------------|
| Docker      | Allocated CPUs                | monitoring.docker.cpusets | 0             |
Note on Docker settings
By default, there are 4 CPU cores allocated: core 0 for monitoring, core 1 for database (MariaDB), and cores 2 and 3 for Keycloak server.
Default memory limits for database and Keycloak server are 2g. The cpuset and memlimit parameters set here are set to cpuset and
mem_limit parameters of docker-compose configuration. See docker-compose documentation for meaning of the values. How to set the parameters
correctly depends on number of factors - number of cpu cores, NUMA, available memory etc., hence it is out of scope of this document.
Example CPU Settings
| HW | Development Machine | "Fat Box" | |-------------|----------------------|--------------| | Cores | 4 | 48 | | NUMA Nodes | 0-3 | 0-23, 24-47 |
Cluster
| Setting                            | Development Machine  | "Fat Box"                   |
|------------------------------------|----------------------|-----------------------------|
| monitoring.docker.cpusets        | 0                    | 0                           |
| db.docker.cpusets                | 1                    | 1                           |
| lb.docker.cpusets                | 1                    | 2                           |
| keycloak.docker.cpusets          | 2-3                  | 3-6 7-10 11-16 … 43-46      |
Cross-DC
| Setting                            | Development Machine  | "Fat Box"                      |
|------------------------------------|----------------------|--------------------------------|
| monitoring.docker.cpusets        | 0                    | 0                              |
| db.dc1.docker.cpusets            | 1                    | 1                              |
| lb.dc1.docker.cpusets            | 1                    | 2                              |
| infinispan.dc1.docker.cpusets    | 1                    | 3                              |
| keycloak.dc1.docker.cpusets      | 2                    | 4-7 8-11 12-15 16-19 20-23     |
| db.dc2.docker.cpusets            | 1                    | 24                             |
| lb.dc2.docker.cpusets            | 1                    | 25                             |
| infinispan.dc2.docker.cpusets    | 1                    | 26                             |
| keycloak.dc2.docker.cpusets      | 3                    | 27-30 31-34 35-38 39-42 43-46  |