This article provides guidance on resource allocation and scaling strategies for deploying Bold Reports. The recommendations are based on load testing and analysis to help ensure efficient performance across different levels of user concurrency.
Key Insights from Load Testing
Load Test Scenario
The load testing simulated user activity over a 10-minute loop, during which users logged in to Bold Reports and navigated through key functional pages such as:
- Data Source Page
- Reports Listing Page
- Reports Viewing Page
The analysis identified resource utilization patterns and scaling requirements across different concurrency levels to support optimal system performance.
Scaling Observations
- Reports Viewer: This is the most resource-intensive service, requiring up to 50 replicas to handle 1000 concurrent users effectively. Ensure sufficient node capacity is available to support this scaling requirement.
- IDP Web and Reports Web: These services require moderate scaling as user concurrency increases to efficiently manage front-end traffic.
Resource Recommendations by User Concurrency Levels
The following sections provide recommended CPU, memory, and pod replica configurations based on concurrency levels observed during load testing.
For 10 concurrent users
| Deployment |
Requested CPU |
Requested Memory |
Required Pod Replicas |
| id-web |
500m |
1 GB |
1 |
| ums-web |
250m |
512 Mi |
1 |
| id-api |
250m |
512 Mi |
1 |
| reports-api |
250m |
512 Mi |
1 |
| reports-jobs |
250m |
512 Mi |
1 |
| reports-viewer |
1 |
4 GB |
1 |
| reports-web |
1 |
4 GB |
1 |
| Report service |
250m |
750 Mi |
1 |
| bold-etl |
250m |
512 Mi |
1 |
For 50 concurrent users
| Deployment |
Requested CPU |
Requested Memory |
Required Pod Replicas |
| id-web |
500m |
2 GB |
1 |
| ums-web |
250m |
750 Mi |
1 |
| id-api |
250m |
750 Mi |
1 |
| reports-api |
250m |
750 Mi |
1 |
| reports-jobs |
250m |
750 Mi |
1 |
| reports-viewer |
1 |
4 GB |
3 |
| reports-web |
1 |
4 GB |
1 |
| Report service |
250m |
750 Mi |
1 |
| bold-etl |
250m |
750 Mi |
1 |
For 100 concurrent users
| Deployment |
Requested CPU |
Requested Memory |
Required Pod Replicas |
| id-web |
500m |
2 GB |
1 |
| ums-web |
250m |
750 Mi |
1 |
| id-api |
250m |
750 Mi |
1 |
| reports-api |
250m |
750 Mi |
1 |
| reports-jobs |
250m |
750 Mi |
1 |
| reports-viewer |
1 |
4 GB |
5 |
| reports-web |
1 |
4 GB |
1 |
| Report service |
250m |
750 Mi |
1 |
| bold-etl |
250m |
750 Mi |
1 |
For 200 concurrent users
| Deployment |
Requested CPU |
Requested Memory |
Required Pod Replicas |
| id-web |
500m |
2 GB |
1 |
| ums-web |
250m |
750 Mi |
1 |
| id-api |
250m |
750 Mi |
1 |
| reports-api |
250m |
750 Mi |
1 |
| reports-jobs |
250m |
750 Mi |
1 |
| reports-viewer |
1 |
4 GB |
10 |
| reports-web |
1 |
4 GB |
1 |
| Report service |
250m |
750 Mi |
1 |
| bold-etl |
250m |
750 Mi |
1 |
For 300 concurrent users
| Deployment |
Requested CPU |
Requested Memory |
Required Pod Replicas |
| id-web |
500m |
2 GB |
2 |
| ums-web |
250m |
750 Mi |
1 |
| id-api |
250m |
750 Mi |
1 |
| reports-api |
250m |
750 Mi |
1 |
| reports-jobs |
250m |
750 Mi |
1 |
| reports-viewer |
1 |
4 GB |
15 |
| reports-web |
1 |
4 GB |
2 |
| Report service |
250m |
750 Mi |
1 |
| bold-etl |
250m |
750 Mi |
1 |
For 400 concurrent users
| Deployment |
Requested CPU |
Requested Memory |
Required Pod Replicas |
| id-web |
500m |
2 GB |
2 |
| ums-web |
250m |
750 Mi |
1 |
| id-api |
250m |
750 Mi |
1 |
| reports-api |
250m |
750 Mi |
1 |
| reports-jobs |
250m |
750 Mi |
1 |
| reports-viewer |
1 |
4 GB |
20 |
| reports-web |
1 |
4 GB |
3 |
| Report service |
250m |
750 Mi |
1 |
| bold-etl |
250m |
750 Mi |
1 |
For 1000 concurrent users
| Deployment |
Requested CPU |
Requested Memory |
Required Pod Replicas |
| id-web |
500m |
2 GB |
4 |
| ums-web |
250m |
750 Mi |
1 |
| id-api |
250m |
750 Mi |
1 |
| reports-api |
250m |
750 Mi |
1 |
| reports-jobs |
250m |
750 Mi |
1 |
| reports-viewer |
1 |
4 GB |
50 |
| reports-web |
1 |
4 GB |
6 |
| Report service |
250m |
750 Mi |
1 |
| bold-etl |
250m |
750 Mi |
1 |
Note: The resource values in this article were observed during load testing with a specific test dataset. Actual memory usage depends heavily on the volume of data each report processes. Memory consumption increases with:
- The number of rows (records) returned by the report’s datasets.
- The number of columns, groups, aggregates, and charts in the report.
- Exporting large reports (for example, to Excel or PDF) and scheduled report exports.
- Many users viewing data-heavy reports at the same time.
If your reports work with high data volumes, increase the memory allocated to the reports-viewer pods (and reports-jobs if you schedule or export large reports) beyond the values listed here. Monitor pod memory usage, and raise the memory request and limit if you see slow rendering, restarts, or pods ending with an OOMKilled status.
See Also