A decoupled daemon that optimizes device-to-cluster assignments using Mixed-Integer Linear Programming (MILP) to minimize energy consumption and carbon footprint.
The optimizer periodically:
- Reads device assignments from the local SQLite database (device_id, cluster_id, app_req_id, estimated_load)
- Fetches each device's application requirements from OpenNebula using the app_req_id
- Filters feasible clusters based on device constraints (flavour, confidentiality, providers, geolocation)
- Runs MILP optimization to find optimal cluster assignments that minimize energy/carbon
- Scales clusters in parallel based on optimizer output via cluster scaling endpoints
- Updates the cluster_id in the database for devices assigned to successfully scaled clusters
Local Database (device_cluster_assignment.db):
- Stores device-to-cluster assignments with application requirements
- Shared between
cognit-frontendandcognit-optimizer - Schema:
device_id,cluster_id,flavour,app_req_id,app_req_json,estimated_load,last_seen
cognit-frontend interaction:
- When a device requests a cluster, cognit-frontend queries OpenNebula for feasible clusters
- Selects the closest cluster and stores the assignment in the database
- The optimizer later re-evaluates these assignments globally to optimize across all devices
cognit-optimizer interaction:
- Reads all device assignments from the database
- Uses
app_req_idto fetch fresh requirements from OpenNebula - Optimizes assignments considering all devices simultaneously
- Scales clusters in parallel via cluster scaling endpoints
- Updates
cluster_idin the database incrementally as clusters finish scaling
Required:
cognit-frontendrepository at/home/ubuntu/cognit-frontend/(importsdb_manager.pyandopennebula.py)- Database file at
/home/ubuntu/cognit-frontend/database/device_cluster_assignment.db - OpenNebula API accessible at
http://localhost:2633/RPC2 - OpenNebula credentials in
~/.one/one_author/var/lib/one/.one/one_auth
-
Ensure cognit-frontend repository exists:
ls /home/ubuntu/cognit-frontend/src/db_manager.py ls /home/ubuntu/cognit-frontend/src/opennebula.py
-
Create virtual environment:
cd cognit-optimizer python3 -m venv venv source venv/bin/activate
-
Install dependencies:
pip install -r requirements.txt
Run single optimization cycle:
python main.pyRun as daemon (continuous mode):
# Use default interval (300 seconds)
python main.py --daemon
# Use custom interval
python main.py --daemon --interval 60