LindormTSDB query performance benchmark across four cluster sizes. All tests ran in an isolated environment with no concurrent write operations — results represent read-only peak throughput. Query performance decreases when the volume of time series data is large, write and read operations run concurrently, or queries scan a large number of time series and time points. Review these results alongside your own business workload before making capacity decisions.
Test dataset
| Property | Value |
|---|---|
| Devices | 100 |
| Metrics per device | 101 measurement values |
| Reporting interval | 10 seconds |
| Data duration | 1 day per device |
Query types
Six query patterns are tested. All queries target the cpu.usage_user metric.
| Query type | What it measures | SQL |
|---|---|---|
1-host-1-hr-raw |
All raw values from 1 device over 1 hour | select time, usage_user from cpu where (hostname = 'host_17') and time >=1514837782646 and time < 1514841382646 ; |
1-host-1-hr |
Max value per minute from 1 device over 1 hour | select time, max(usage_user) as max_usage_user from cpu where (hostname = 'host_17') and time >=1514837782646 and time < 1514841382646 sample by 1m |
1-host-12-hr-raw |
All raw values from 1 device over 12 hours | select time, usage_user from cpu where (hostname = 'host_0') and time >=1514787382646 and time < 1514830582646; |
1-host-12-hr |
Max value per minute from 1 device over 12 hours | select time, max(usage_user) as max_usage_user from cpu where (hostname = 'host_0') and time >=1514787382646 and time < 1514830582646 sample by 1m ; |
1-host-latest |
Latest value from 1 device | select time, latest(usage_user) as latest_usage_user from cpu where (hostname = 'host_50') sample by 0 |
8-host-latest |
Latest values from 8 devices | select time, latest(usage_user) as latest_usage_user from cpu where (hostname = 'host_64' or hostname = 'host_80' or hostname = 'host_21' or hostname = 'host_5' or hostname = 'host_79' or hostname = 'host_47' or hostname = 'host_25' or hostname = 'host_18') sample by 0 |
Performance metrics
| Metric | Description |
|---|---|
queryType |
Query type, as described in the table above |
worker |
Number of concurrent queries |
qps |
SQL queries per second |
max_cpu |
Peak CPU utilization (%) |
max_mem |
Peak memory usage (%) |
Test results
Each result table below is measured with only the test workload running on LindormTSDB. No other workload runs during the test.
Cluster 1 — 3 nodes, 4 cores, 16 GB memory
QPS scales well from 16 to 50 workers, then plateaus. Short-window queries (1-host-1-hr) reach up to 1,887 QPS. Multi-device latest-value queries (8-host-latest) are CPU-bound, reaching 97% CPU at all concurrency levels.
| queryType | worker | qps | max_cpu | max_mem |
|---|---|---|---|---|
| 1-host-1-hr | 16 | 1,420.96 | 86.95 | 48.08 |
| 1-host-1-hr | 50 | 1,865.50 | 83.45 | 49.32 |
| 1-host-1-hr | 100 | 1,887.00 | 81.71 | 48.95 |
| 1-host-1-hr | 200 | 1,846.00 | 82.99 | 48.87 |
| 1-host-1-hr-raw | 16 | 1,324.80 | 79.54 | 50.34 |
| 1-host-1-hr-raw | 50 | 1,722.00 | 86.42 | 50.96 |
| 1-host-1-hr-raw | 100 | 1,737.00 | 86.36 | 50.92 |
| 1-host-1-hr-raw | 200 | 1,752.00 | 87.09 | 50.88 |
| 1-host-12-hr | 16 | 497.44 | 86.77 | 48.81 |
| 1-host-12-hr | 50 | 555.00 | 95.05 | 48.81 |
| 1-host-12-hr | 100 | 571.00 | 94.97 | 48.90 |
| 1-host-12-hr | 200 | 584.00 | 94.77 | 49.11 |
| 1-host-12-hr-raw | 16 | 286.56 | 82.20 | 51.04 |
| 1-host-12-hr-raw | 50 | 328.00 | 95.34 | 51.14 |
| 1-host-12-hr-raw | 100 | 330.00 | 96.51 | 51.21 |
| 1-host-12-hr-raw | 200 | 334.00 | 96.70 | 51.56 |
| 1-host-latest | 16 | 1,025.12 | 81.79 | 49.34 |
| 1-host-latest | 50 | 1,146.00 | 93.36 | 49.42 |
| 1-host-latest | 100 | 1,144.00 | 92.41 | 49.36 |
| 1-host-latest | 200 | 1,164.00 | 92.89 | 49.44 |
| 8-host-latest | 16 | 175.20 | 96.65 | 49.64 |
| 8-host-latest | 50 | 180.00 | 97.01 | 49.95 |
| 8-host-latest | 100 | 181.00 | 96.59 | 50.05 |
| 8-host-latest | 200 | 182.00 | 96.73 | 50.15 |
Cluster 2 — 3 nodes, 8 cores, 32 GB memory
Doubling cores and memory roughly doubles QPS for most query types. The 1-host-1-hr query reaches 3,584 QPS at 200 workers; 8-host-latest reaches 472 QPS. Memory usage drops significantly compared to Cluster 1, reflecting the larger memory headroom.
| queryType | worker | qps | max_cpu | max_mem |
|---|---|---|---|---|
| 1-host-1-hr | 16 | 2,426.56 | 79.45 | 31.83 |
| 1-host-1-hr | 50 | 3,363.50 | 71.58 | 33.50 |
| 1-host-1-hr | 100 | 3,530.00 | 73.80 | 35.44 |
| 1-host-1-hr | 200 | 3,584.00 | 70.12 | 35.43 |
| 1-host-1-hr-raw | 16 | 2,181.92 | 52.67 | 36.10 |
| 1-host-1-hr-raw | 50 | 3,231.50 | 69.77 | 36.20 |
| 1-host-1-hr-raw | 100 | 3,371.00 | 72.88 | 36.19 |
| 1-host-1-hr-raw | 200 | 3,348.00 | 69.80 | 35.08 |
| 1-host-12-hr | 16 | 877.44 | 59.57 | 35.66 |
| 1-host-12-hr | 50 | 1,132.50 | 82.37 | 35.51 |
| 1-host-12-hr | 100 | 1,145.00 | 84.10 | 35.55 |
| 1-host-12-hr | 200 | 1,152.00 | 84.69 | 35.62 |
| 1-host-12-hr-raw | 16 | 445.44 | 58.55 | 35.29 |
| 1-host-12-hr-raw | 50 | 641.00 | 84.98 | 35.31 |
| 1-host-12-hr-raw | 100 | 668.00 | 90.79 | 35.35 |
| 1-host-12-hr-raw | 200 | 670.00 | 91.98 | 35.42 |
| 1-host-latest | 16 | 1,785.44 | 51.20 | 35.80 |
| 1-host-latest | 50 | 2,273.50 | 64.86 | 35.92 |
| 1-host-latest | 100 | 2,280.00 | 64.97 | 35.82 |
| 1-host-latest | 200 | 2,284.00 | 65.01 | 35.85 |
| 8-host-latest | 16 | 439.04 | 85.04 | 35.98 |
| 8-host-latest | 50 | 471.50 | 91.71 | 36.00 |
| 8-host-latest | 100 | 472.00 | 92.42 | 36.08 |
| 8-host-latest | 200 | 470.00 | 93.10 | 36.09 |
Cluster 3 — 3 nodes, 16 cores, 64 GB memory
QPS scales substantially with more cores. The 1-host-1-hr query reaches 8,902 QPS at 200 workers. Memory usage stays below 28%, indicating the dataset fits comfortably in memory. Higher concurrency continues to improve throughput for most query types.
| queryType | worker | qps | max_cpu | max_mem |
|---|---|---|---|---|
| 1-host-1-hr | 16 | 3,287.84 | 49.77 | 25.83 |
| 1-host-1-hr | 50 | 6,543.50 | 56.06 | 26.45 |
| 1-host-1-hr | 100 | 7,713.00 | 59.81 | 26.48 |
| 1-host-1-hr | 200 | 8,902.00 | 75.23 | 26.47 |
| 1-host-1-hr-raw | 16 | 2,857.60 | 32.42 | 26.89 |
| 1-host-1-hr-raw | 50 | 5,173.00 | 50.44 | 26.96 |
| 1-host-1-hr-raw | 100 | 6,177.00 | 56.88 | 26.95 |
| 1-host-1-hr-raw | 200 | 6,530.00 | 59.20 | 26.98 |
| 1-host-12-hr | 16 | 1,148.48 | 38.69 | 26.52 |
| 1-host-12-hr | 50 | 1,920.50 | 71.18 | 26.57 |
| 1-host-12-hr | 100 | 2,181.00 | 82.79 | 26.62 |
| 1-host-12-hr | 200 | 2,398.00 | 91.44 | 26.64 |
| 1-host-12-hr-raw | 16 | 539.20 | 33.78 | 27.04 |
| 1-host-12-hr-raw | 50 | 704.50 | 46.87 | 27.12 |
| 1-host-12-hr-raw | 100 | 612.00 | 41.76 | 27.17 |
| 1-host-12-hr-raw | 200 | 694.00 | 46.89 | 27.24 |
| 1-host-latest | 16 | 2,141.60 | 40.24 | 26.69 |
| 1-host-latest | 50 | 3,602.00 | 77.84 | 26.69 |
| 1-host-latest | 100 | 4,098.00 | 91.87 | 26.72 |
| 1-host-latest | 200 | 4,356.00 | 94.94 | 26.71 |
| 8-host-latest | 16 | 541.28 | 81.87 | 26.77 |
| 8-host-latest | 50 | 599.50 | 97.52 | 26.77 |
| 8-host-latest | 100 | 648.00 | 97.85 | 26.88 |
| 8-host-latest | 200 | 832.00 | 97.40 | 26.94 |
Cluster 4 — 3 nodes, 32 cores, 128 GB memory
The largest cluster delivers the highest throughput. The 1-host-1-hr query reaches 15,072 QPS at 200 workers — approximately 8x the throughput of Cluster 1 at the same concurrency. The 1-host-latest query reaches 9,634 QPS. CPU utilization remains low for single-host queries, leaving headroom for mixed workloads.
| queryType | worker | qps | max_cpu | max_mem |
|---|---|---|---|---|
| 1-host-1-hr | 16 | 3,543.04 | 24.25 | 28.33 |
| 1-host-1-hr | 50 | 9,351.00 | 34.14 | 28.89 |
| 1-host-1-hr | 100 | 12,567.00 | 46.42 | 28.92 |
| 1-host-1-hr | 200 | 15,072.00 | 57.27 | 28.94 |
| 1-host-1-hr-raw | 16 | 2,811.20 | 15.41 | 29.11 |
| 1-host-1-hr-raw | 50 | 6,086.50 | 27.85 | 29.13 |
| 1-host-1-hr-raw | 100 | 7,881.00 | 36.44 | 29.14 |
| 1-host-1-hr-raw | 200 | 8,762.00 | 40.97 | 29.17 |
| 1-host-12-hr | 16 | 1,394.24 | 18.85 | 28.91 |
| 1-host-12-hr | 50 | 3,317.50 | 49.89 | 28.96 |
| 1-host-12-hr | 100 | 4,160.00 | 67.13 | 28.96 |
| 1-host-12-hr | 200 | 4,808.00 | 79.02 | 28.96 |
| 1-host-12-hr-raw | 16 | 542.56 | 17.31 | 29.22 |
| 1-host-12-hr-raw | 50 | 826.50 | 24.96 | 29.24 |
| 1-host-12-hr-raw | 100 | 669.00 | 23.55 | 29.28 |
| 1-host-12-hr-raw | 200 | 772.00 | 24.86 | 29.32 |
| 1-host-latest | 16 | 2,600.00 | 16.04 | 28.97 |
| 1-host-latest | 50 | 6,590.00 | 46.11 | 28.98 |
| 1-host-latest | 100 | 8,516.00 | 65.60 | 28.99 |
| 1-host-latest | 200 | 9,634.00 | 75.93 | 28.98 |
| 8-host-latest | 16 | 949.12 | 55.91 | 29.03 |
| 8-host-latest | 50 | 1,525.50 | 83.49 | 29.04 |
| 8-host-latest | 100 | 1,710.00 | 93.16 | 29.06 |
| 8-host-latest | 200 | 1,758.00 | 95.54 | 29.09 |
Performance summary
Peak QPS (across all concurrency levels) for each cluster and query type. Higher worker counts do not always improve QPS — results plateau or vary depending on CPU saturation.
| Query type | Cluster 1 (4c/16G) | Cluster 2 (8c/32G) | Cluster 3 (16c/64G) | Cluster 4 (32c/128G) |
|---|---|---|---|---|
| 1-host-1-hr | 1,887 | 3,584 | 8,902 | 15,072 |
| 1-host-1-hr-raw | 1,752 | 3,371 | 6,530 | 8,762 |
| 1-host-12-hr | 584 | 1,152 | 2,398 | 4,808 |
| 1-host-12-hr-raw | 334 | 670 | 704.50 | 826.50 |
| 1-host-latest | 1,164 | 2,284 | 4,356 | 9,634 |
| 8-host-latest | 182 | 472 | 832 | 1,758 |