110 lines
3.8 KiB
Markdown
110 lines
3.8 KiB
Markdown
# Όρια Πόρων (Resource Limits)
|
|
|
|
> [!WARNING]
|
|
> **Κατάσταση: Πρόταση / Οδικός Χάρτης**
|
|
>
|
|
> Αυτό το έγγραφο περιγράφει προτεινόμενες προσεγγίσεις περιορισμού πόρων. Για την τρέχουσα υλοποίηση, ανατρέξτε στα έγγραφα [config-reference.md](config-reference.md) και [operations-runbook.md](operations-runbook.md).
|
|
|
|
## Περιγραφή Προβλήματος
|
|
|
|
Το ZeroClaw εφαρμόζει περιορισμό ρυθμού (Rate Limiting - 20 ενέργειες/ώρα), αλλά δεν διαθέτει ανώτατα όρια χρήσης πόρων συστήματος. Χωρίς αυτούς τους περιορισμούς, ένας πράκτορας ενδέχεται να:
|
|
- Καταναλώσει υπερβολική μνήμη (RAM).
|
|
- Προκαλέσει υψηλό φόρτο CPU (100%).
|
|
- Εξαντλήσει τον αποθηκευτικό χώρο (disk space) με logs ή προσωρινά αρχεία.
|
|
|
|
---
|
|
|
|
## Προτεινόμενες Τεχνικές Προσεγγίσεις
|
|
|
|
### 1. cgroups v2 (Linux)
|
|
|
|
Αυτή είναι η συνιστώμενη μέθοδος για την απομόνωση των πόρων του ZeroClaw σε επίπεδο λειτουργικού συστήματος.
|
|
|
|
```bash
|
|
# Παράδειγμα υπηρεσίας systemd με περιορισμούς
|
|
[Service]
|
|
MemoryMax=512M
|
|
CPUQuota=100%
|
|
IOReadBandwidthMax=/dev/sda 10M
|
|
IOWriteBandwidthMax=/dev/sda 10M
|
|
TasksMax=100
|
|
```
|
|
|
|
### 2. Έλεγχος Ασύγχρονων Εργασιών (Tokio Tasks)
|
|
|
|
Ενσωμάτωση χρονικών ορίων (timeouts) για την αποφυγή κατάληψης των νημάτων (task starvation).
|
|
|
|
```rust
|
|
use tokio::time::{timeout, Duration};
|
|
|
|
pub async fn execute_with_timeout<F, T>(
|
|
fut: F,
|
|
cpu_time_limit: Duration,
|
|
) -> Result<T>
|
|
where
|
|
F: Future<Output = Result<T>>,
|
|
{
|
|
// Περιορισμός χρόνου εκτέλεσης
|
|
timeout(cpu_time_limit, fut).await?
|
|
}
|
|
```
|
|
|
|
### 3. Διαχείριση Μνήμης (Memory Monitoring)
|
|
|
|
Εποπτεία της χρήσης του σωρού (heap) και αυτόματος τερματισμός σε περίπτωση υπέρβασης των ορίων.
|
|
|
|
```rust
|
|
use std::alloc::{GlobalAlloc, Layout, System};
|
|
|
|
struct LimitedAllocator<A> {
|
|
inner: A,
|
|
max_bytes: usize,
|
|
used: std::sync::atomic::AtomicUsize,
|
|
}
|
|
|
|
unsafe impl<A: GlobalAlloc> GlobalAlloc for LimitedAllocator<A> {
|
|
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
|
|
let size = layout.size();
|
|
let current = self.used.fetch_add(size, std::sync::atomic::Ordering::Relaxed);
|
|
if current + size > self.max_bytes {
|
|
std::process::abort();
|
|
}
|
|
self.inner.alloc(layout)
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Προτεινόμενη Διαμόρφωση (Config Schema)
|
|
|
|
```toml
|
|
[resources]
|
|
# Όρια μνήμης (MB)
|
|
max_memory_mb = 512
|
|
max_memory_per_command_mb = 128
|
|
|
|
# Όρια CPU
|
|
max_cpu_percent = 50
|
|
max_cpu_time_seconds = 60
|
|
|
|
# Όρια αποθήκευσης (I/O)
|
|
max_log_size_mb = 100
|
|
max_temp_storage_mb = 500
|
|
|
|
# Όρια διεργασιών και αρχείων
|
|
max_subprocesses = 10
|
|
max_open_files = 100
|
|
```
|
|
|
|
---
|
|
|
|
## Σχέδιο Υλοποίησης ανά Προτεραιότητα
|
|
|
|
| Προτεραιότητα | Χαρακτηριστικό | Δυσκολία | Αντίκτυπος |
|
|
|:---:|:---|:---:|:---:|
|
|
| **P0** | Παρακολούθηση μνήμης & Fail-safe τερματισμός | Χαμηλή | Υψηλός |
|
|
| **P1** | Timeouts CPU ανά εντολή | Χαμηλή | Υψηλός |
|
|
| **P2** | Υποστήριξη cgroups (Linux) | Μέτρια | Πολύ Υψηλός |
|
|
| **P3** | Περιορισμοί I/O δίσκου | Μέτρια | Μέτριος |
|