From ccdc55524631ffc81076e45069f9c9d4092cda42 Mon Sep 17 00:00:00 2001 From: "Patrick Asmus (scriptos)" Date: Thu, 16 Apr 2026 21:33:47 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Offense-Cleanup-Worker=20mit=20niedrigst?= =?UTF-8?q?er=20CPU/IO-Priorit=C3=A4t=20ausf=C3=BChren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adguard-shield.sh | 4 ++-- docs/architektur.md | 2 +- docs/befehle.md | 2 +- docs/konfiguration.md | 2 +- offense-cleanup-worker.sh | 15 ++++++++++++++- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/adguard-shield.sh b/adguard-shield.sh index 4dc26c2..b5b9907 100644 --- a/adguard-shield.sh +++ b/adguard-shield.sh @@ -1271,8 +1271,8 @@ start_offense_cleanup_worker() { return fi - log "INFO" "Starte Offense-Cleanup-Worker im Hintergrund..." - bash "$worker_script" start & + log "INFO" "Starte Offense-Cleanup-Worker im Hintergrund (nice 19, idle I/O)..." + nice -n 19 ionice -c 3 bash "$worker_script" start & OFFENSE_CLEANUP_WORKER_PID=$! log "INFO" "Offense-Cleanup-Worker gestartet (PID: $OFFENSE_CLEANUP_WORKER_PID)" } diff --git a/docs/architektur.md b/docs/architektur.md index 904613f..34637a6 100644 --- a/docs/architektur.md +++ b/docs/architektur.md @@ -137,7 +137,7 @@ Das ermöglicht: ├── external-blocklist-worker.sh # Externer Blocklist-Worker ├── external-whitelist-worker.sh # Externer Whitelist-Worker (DNS-Auflösung) ├── geoip-worker.sh # GeoIP-Länderfilter-Worker -├── offense-cleanup-worker.sh # Automatisches Aufräumen abgelaufener Offense-Zähler +├── offense-cleanup-worker.sh # Aufräumen abgelaufener Offense-Zähler (nice 19, idle I/O) ├── unban-expired.sh # Cron-basiertes Entsperren └── geoip/ # Auto-Download MaxMind GeoLite2 DB (optional) diff --git a/docs/befehle.md b/docs/befehle.md index 22c890d..385cc1b 100644 --- a/docs/befehle.md +++ b/docs/befehle.md @@ -284,7 +284,7 @@ sudo /opt/adguard-shield/geoip-worker.sh flush-cache ## Offense-Cleanup-Worker -Der Offense-Cleanup-Worker räumt abgelaufene Offense-Zähler (progressive Sperren) automatisch auf. Er startet automatisch mit dem Hauptservice, wenn progressive Sperren aktiviert sind, und prüft stündlich ob Zähler aufgeräumt werden können. +Der Offense-Cleanup-Worker räumt abgelaufene Offense-Zähler (progressive Sperren) automatisch auf. Er startet automatisch mit dem Hauptservice, wenn progressive Sperren aktiviert sind, und prüft stündlich ob Zähler aufgeräumt werden können. Der Worker läuft mit niedrigster CPU- und I/O-Priorität (`nice 19`, `ionice idle`), um den DNS-Dienst nicht zu beeinträchtigen. Der Worker kann auch standalone gesteuert werden: diff --git a/docs/konfiguration.md b/docs/konfiguration.md index 85f0c41..4bd4889 100644 --- a/docs/konfiguration.md +++ b/docs/konfiguration.md @@ -100,7 +100,7 @@ Wiederholungstäter werden wie bei fail2ban stufenweise länger gesperrt. Wird e | 4. Mal | 4 | 8 Stunden | 3600 × 8 | | 5. Mal | 5 | **PERMANENT** | Max-Stufe erreicht | -> **Hinweis:** Abgelaufene Offense-Zähler werden automatisch vom **Offense-Cleanup-Worker** aufgeräumt, der stündlich prüft, ob das letzte Vergehen einer IP länger als `PROGRESSIVE_BAN_RESET_AFTER` zurückliegt. Der Worker startet automatisch zusammen mit dem Hauptservice, wenn progressive Sperren aktiviert sind. Manuelles Zurücksetzen ist jederzeit mit `reset-offenses` möglich. Permanente Sperren werden **nicht** automatisch aufgehoben – sie müssen manuell mit `unban` oder `flush` entfernt werden. +> **Hinweis:** Abgelaufene Offense-Zähler werden automatisch vom **Offense-Cleanup-Worker** aufgeräumt, der stündlich prüft, ob das letzte Vergehen einer IP länger als `PROGRESSIVE_BAN_RESET_AFTER` zurückliegt. Der Worker startet automatisch zusammen mit dem Hauptservice, wenn progressive Sperren aktiviert sind. Er läuft mit niedrigster CPU- und I/O-Priorität (`nice 19`, `ionice idle`), sodass andere Dienste nicht beeinträchtigt werden. Manuelles Zurücksetzen ist jederzeit mit `reset-offenses` möglich. Permanente Sperren werden **nicht** automatisch aufgehoben – sie müssen manuell mit `unban` oder `flush` entfernt werden. ### Logging diff --git a/offense-cleanup-worker.sh b/offense-cleanup-worker.sh index b160854..ff40f9e 100644 --- a/offense-cleanup-worker.sh +++ b/offense-cleanup-worker.sh @@ -8,7 +8,7 @@ # # Autor: Patrick Asmus # E-Mail: support@techniverse.net -# Datum: 2026-04-14 +# Datum: 2026-04-16 # Lizenz: MIT ############################################################################### @@ -25,6 +25,12 @@ fi # shellcheck source=adguard-shield.conf source "$CONFIG_FILE" +# ─── Niedrigste Priorität setzen (CPU + I/O) ───────────────────────────────── +# Stellt sicher, dass der Worker auch bei manuellem Start nie andere Dienste +# verdrängt. nice 19 = niedrigste CPU-Priorität, ionice idle = nur bei freier I/O. +renice -n 19 $$ >/dev/null 2>&1 || true +ionice -c 3 -p $$ >/dev/null 2>&1 || true + # ─── Worker PID-File ────────────────────────────────────────────────────────── WORKER_PID_FILE="/var/run/adguard-offense-cleanup-worker.pid" @@ -80,6 +86,7 @@ cleanup_expired_offenses() { now=$(date '+%s') local cleaned=0 + local batch_count=0 for offense_file in "${STATE_DIR}"/*.offenses; do [[ -f "$offense_file" ]] || continue @@ -101,6 +108,12 @@ cleanup_expired_offenses() { rm -f "$offense_file" cleaned=$((cleaned + 1)) fi + + # Alle 10 Dateien kurz pausieren, um I/O-Bursts zu vermeiden + batch_count=$((batch_count + 1)) + if (( batch_count % 10 == 0 )); then + sleep 0.1 + fi done if [[ $cleaned -gt 0 ]]; then