Here’s a comprehensive optimization strategy addressing all your performance bottlenecks:
Composite Indexing Strategy
Implement compound indexes on your measurement collections:
db.measurements.createIndex(
{"source.id": 1, "type": 1, "time": -1},
{background: true}
)
This enables efficient filtering by device, measurement type, and time range in a single index lookup.
Time-Series Data Partitioning
Migrate to monthly partitioned collections using Cumulocity’s DataBroker. Configure retention policies:
POST /tenant/options
{
"category": "configuration",
"key": "data.measurements.retention",
"value": "90"
}
Partition naming: measurements_2025_03, measurements_2025_04. Query router logic targets specific partitions based on date range.
Query Result Caching
Implement Redis-backed caching layer:
- Cache aggregated metrics with 10-15 minute TTL
- Use cache keys: `agg:{deviceGroup}:{metricType}:{timeWindow}
- Invalidate on measurement arrival via Cumulocity real-time notifications
- Serve 80%+ of dashboard queries from cache
Connection Pool Tuning
Increase MongoDB connection pool in microservice configuration:
C8Y_MONGODB_POOL_SIZE=400
C8Y_MONGODB_MAX_WAIT_TIME=120000
Monitor connection utilization - aim for 60-70% peak usage.
Aggregation Pipeline Optimization
Replace client-side aggregation with server-side pipeline:
db.measurements.aggregate([
{$match: {"source.id": {$in: deviceIds}, "time": {$gte: start, $lte: end}}},
{$group: {_id: {hour: {$hour: "$time"}}, avgTemp: {$avg: "$c8y_TemperatureMeasurement.T.value"}}},
{$sort: {"_id.hour": 1}}
])
Use $project to limit field projection and reduce memory footprint.
Pre-Aggregation Strategy
Implement Smart Rules that compute hourly/daily aggregates:
- Trigger on measurement creation events
- Maintain summary collections:
measurements_hourly, `measurements_daily
- Dashboard queries target pre-aggregated data for 90%+ of use cases
Implementation Order
- Deploy compound indexes (immediate 3-5x improvement)
- Increase connection pool (resolves timeout issues)
- Implement Redis caching (reduces database load by 70%)
- Migrate to partitioned collections (enables horizontal scaling)
- Deploy pre-aggregation Smart Rules (long-term maintenance)
Expected Results
- Query response time: 30-45s → 2-4s
- Cache hit rate: 75-85%
- Database CPU utilization: reduced by 60%
- Support for 500K+ devices with same infrastructure
Monitor using Cumulocity’s built-in performance metrics and adjust TTLs based on your data freshness requirements.