README.md aktualisiert

This commit is contained in:
2025-10-27 16:59:52 +01:00
parent fa29d6d2f2
commit dd864f249d

553
README.md
View File

@@ -1,3 +1,552 @@
# deep-shop-strace-analyse # Deep Shop strace Analyse
Überprüft gründlich womit PHP der Shop beschäftigt ist per strace. Ein leistungsstarkes Python-Tool zur Performance-Analyse von JTL-Shop-Instanzen durch systematisches Tracing von PHP-FPM-Prozessen.
## 📋 Inhaltsverzeichnis
- [Überblick](#überblick)
- [Features](#features)
- [Voraussetzungen](#voraussetzungen)
- [Installation](#installation)
- [Verwendung](#verwendung)
- [Ausgabe-Dateien](#ausgabe-dateien)
- [Beispiele](#beispiele)
- [Troubleshooting](#troubleshooting)
- [Technische Details](#technische-details)
- [Contributing](#contributing)
- [Kontakt](#kontakt)
---
## 🎯 Überblick
`straceanalyse.py` ist ein spezialisiertes Diagnose-Tool für JTL-Shop-Umgebungen auf Plesk-basierten Servern. Es analysiert PHP-FPM-Prozesse mittels `strace` und identifiziert Performance-Probleme wie:
- Fehlende Bilder und Dateien (ENOENT-Fehler)
- Übermäßige Filesystem-Zugriffe
- Langsame MySQL-Queries
- Redis-Operation-Patterns
- ImageMagick-Bottlenecks
- Memory-Allocation-Probleme
Das Tool verknüpft jedes Problem mit dem auslösenden PHP-Script und generiert automatisch Lösungsvorschläge.
---
## ✨ Features
### Kern-Features
- **🔍 Automatische PHP-FPM-Prozess-Erkennung**: Findet alle aktiven Worker für einen Shop
- **📊 Syscall-Analyse**: Detaillierte Aufschlüsselung aller System-Calls
- **📁 Fehlende-Dateien-Tracking**: Identifiziert nicht vorhandene Bilder/Ressourcen
- **🔗 Script-Context-Mapping**: Zeigt welches PHP-Script fehlende Dateien aufruft
- **💾 Multi-Format-Export**: TXT, CSV, Bash-Scripts
- **🚀 Parallel-Processing**: Analysiert alle PHP-FPM-Worker gleichzeitig
- **📈 Progress-Tracking**: Echtzeit-Fortschrittsanzeige
### Analyse-Bereiche
- **Filesystem Operations**: stat(), open(), access() Calls
- **MySQL Queries**: SELECT, UPDATE, INSERT, DELETE
- **Redis Operations**: SADD, GET, SET, HGET, etc.
- **Network I/O**: Langsame Verbindungen, Timeouts
- **Memory Operations**: mremap(), mmap() Patterns
- **Image Processing**: ImageMagick-Aufrufe
---
## 📦 Voraussetzungen
### System-Anforderungen
- **OS**: Linux (Debian/Ubuntu)
- **Python**: 3.7+
- **Plesk**: Ja (für Multi-PHP-Pool-Support)
- **Root-Zugriff**: Erforderlich für strace
### Abhängigkeiten
```bash
# System-Pakete
apt-get install strace python3
# Python-Module (Standard-Library)
# Keine zusätzlichen pip-Pakete erforderlich!
```
---
## 🚀 Installation
### 1. Repository klonen
```bash
git clone https://git.jtl-hosting.de/thomasciesla/deep-shop-strace-analyse.git
cd deep-shop-strace-analyse
```
### 2. Script ausführbar machen
```bash
chmod +x straceanalyse.py
```
### 3. Test-Run
```bash
python3 straceanalyse.py --help
```
---
## 💻 Verwendung
### Basis-Syntax
```bash
python3 straceanalyse.py <domain> [duration] [max_processes]
```
### Parameter
| Parameter | Typ | Default | Beschreibung |
|-----------|-----|---------|--------------|
| `domain` | String | **Pflicht** | Shop-Domain (z.B. `example.com`) |
| `duration` | Integer | `5` | Sekunden pro Prozess-Trace |
| `max_processes` | Integer | `alle` | Max. Anzahl zu analysierender Prozesse |
### Basis-Beispiele
```bash
# Standard-Analyse (5 Sekunden pro Prozess, alle Worker)
python3 straceanalyse.py mein-shop.de
# Längere Analyse für mehr Daten (10 Sekunden)
python3 straceanalyse.py mein-shop.de 10
# Limitiert auf 20 Prozesse
python3 straceanalyse.py mein-shop.de 10 20
# Sehr schnelle Analyse (3 Sekunden, max 10 Prozesse)
python3 straceanalyse.py mein-shop.de 3 10
```
### Erweiterte Verwendung
#### High-Traffic-Shop analysieren
```bash
# Bei hoher Last: Kurze Duration, viele Prozesse
python3 straceanalyse.py high-traffic-shop.de 3 50
```
#### Low-Traffic-Shop analysieren
```bash
# Bei wenig Traffic: Längere Duration für mehr Daten
python3 straceanalyse.py low-traffic-shop.de 15
```
#### Kontinuierliches Monitoring
```bash
# Alle 5 Minuten analysieren
watch -n 300 'python3 straceanalyse.py mein-shop.de 5 10'
```
#### Output in Log-Datei
```bash
python3 straceanalyse.py mein-shop.de 10 | tee shop-analyse-$(date +%Y%m%d-%H%M).log
```
---
## 📂 Ausgabe-Dateien
Das Script erstellt ein Verzeichnis: `/root/shop_analysis_<domain>_<timestamp>/`
### Generierte Dateien
#### 1. `missing_files_all.txt`
Komplette Liste aller fehlenden Dateien mit Script-Context.
```
[ 24x] /var/www/vhosts/shop.de/httpdocs/media/image/manufacturer/28/xs/logo.jpg
======================================================================
Aufgerufen von:
* includes/src/Catalog/Product/Artikel.php
* includes/src/Helpers/Product.php
Bei Requests:
* /artikel/produktname-123
* /kategorie/hersteller-28
PIDs: 12345, 12346, 12347
```
#### 2. `missing_files_by_script.txt`
Gruppiert nach PHP-Script - zeigt welches Script welche Dateien sucht.
```
======================================================================
SCRIPT: includes/src/Catalog/Product/Artikel.php
======================================================================
Anzahl fehlender Dateien: 156
[ 24x] media/image/manufacturer/28/xs/logo.jpg
[ 18x] media/image/product/1234/sm/produkt.jpg
...
```
#### 3. `missing_files_by_category.txt`
Nach Kategorie gruppiert (Hersteller, Produkte, Variationen, etc.).
```
======================================================================
HERSTELLER-BILDER
======================================================================
Anzahl Dateien: 89
Zugriffe gesamt: 456
[ 24x] media/image/manufacturer/28/xs/logo.jpg
[ 20x] media/image/manufacturer/180/xs/logo.jpg
...
```
#### 4. `missing_files.csv`
CSV-Format für Excel/Spreadsheet-Analyse.
```csv
Zugriffe,Kategorie,Dateipfad,Aufgerufen_von_Script
24,Hersteller,"/var/www/.../manufacturer/28/xs/logo.jpg","Artikel.php; Product.php"
20,Hersteller,"/var/www/.../manufacturer/180/xs/logo.jpg","Product.php"
```
#### 5. `create_placeholders.sh` ⭐
**Automatisches Fix-Script** - Erstellt Platzhalter für fehlende Bilder.
```bash
#!/bin/bash
# Ausführen mit:
bash create_placeholders.sh
# Output:
# Erstelle fehlende Dateien...
# Fertig!
# Erstellt: 156 Platzhalter
# Übersprungen: 23 (existieren bereits)
# Total Dateien: 179
```
#### 6. `missing_manufacturer_ids.txt`
Liste aller Hersteller-IDs mit fehlenden Bildern.
```
# Hersteller IDs mit fehlenden Bildern
# Total: 45 Hersteller
28
180
493
1104
...
```
#### 7. `missing_files_paths_only.txt`
Nur Dateipfade - für weitere Script-Verarbeitung.
```
/var/www/vhosts/shop.de/httpdocs/media/image/manufacturer/28/xs/logo.jpg
/var/www/vhosts/shop.de/httpdocs/media/image/product/1234/sm/bild.jpg
...
```
---
## 📊 Terminal-Ausgabe
### Beispiel-Output
```
================================================================================
PERFORMANCE ANALYSE: mein-shop.de
Datum: 2025-10-27 16:30:45
================================================================================
SYSCALL STATISTIK
--------------------------------------------------------------------------------
newfstatat : 2456 ( 35.2%) ###################
recvfrom : 1823 ( 26.1%) #############
sendto : 1245 ( 17.8%) #########
poll : 892 ( 12.8%) ######
read : 234 ( 3.4%) ##
...
FEHLENDE DATEIEN (ENOENT) - MIT SCRIPT CONTEXT
--------------------------------------------------------------------------------
WARNUNG: 156 verschiedene Dateien nicht gefunden!
WARNUNG: 678 Zugriffe
Top 10 fehlende Dateien (mit aufrufendem Script):
[ 24x] media/image/manufacturer/28/xs/logo.jpg
Aufgerufen von:
-> includes/src/Catalog/Product/Artikel.php
-> includes/src/Helpers/Product.php
[ 20x] media/image/manufacturer/180/xs/logo.jpg
Aufgerufen von:
-> includes/src/Catalog/Product/Artikel.php
...
FEHLER
--------------------------------------------------------------------------------
ENOENT : 678x
EAGAIN : 234x
================================================================================
EXPORTIERE FEHLENDE DATEIEN
================================================================================
Dateien exportiert nach: /root/shop_analysis_mein-shop.de_20251027_163045
Erstellt:
missing_files_all.txt - Komplette Liste MIT Script-Context
missing_files_by_script.txt - Gruppiert nach PHP-Script
missing_files_by_category.txt - Nach Kategorie gruppiert
missing_files.csv - CSV mit Script-Info
create_placeholders.sh - Bash Script
missing_manufacturer_ids.txt - Hersteller IDs
missing_files_paths_only.txt - Nur Pfade
Quick-Fix:
bash /root/shop_analysis_mein-shop.de_20251027_163045/create_placeholders.sh
================================================================================
ZUSAMMENFASSUNG
================================================================================
* Total Syscalls: 6972
* Fehlende Dateien: 156
* MySQL Queries: 423
Export-Verzeichnis: /root/shop_analysis_mein-shop.de_20251027_163045
```
---
## 🔧 Beispiele
### Szenario 1: Performance-Problem diagnostizieren
```bash
# Shop läuft langsam - erste Analyse
python3 straceanalyse.py slow-shop.de 10
# Ausgabe prüfen - viele fehlende Bilder?
# → Quick-Fix ausführen
cd /root/shop_analysis_*
bash create_placeholders.sh
# Erneut testen
python3 straceanalyse.py slow-shop.de 5
```
### Szenario 2: Spezifisches Script debuggen
```bash
# Analyse durchführen
python3 straceanalyse.py problem-shop.de 10
# In den Exports nach problematischem Script suchen
cat /root/shop_analysis_*/missing_files_by_script.txt | grep -A 20 "Problem.php"
```
### Szenario 3: Alle Shops auf Server analysieren
```bash
#!/bin/bash
# analyse_all_shops.sh
SHOPS=(
"shop1.de"
"shop2.de"
"shop3.de"
)
for shop in "${SHOPS[@]}"; do
echo "Analysiere $shop..."
python3 straceanalyse.py "$shop" 5 10
echo "---"
done
```
### Szenario 4: Vergleich vor/nach Optimierung
```bash
# Vor Optimierung
python3 straceanalyse.py shop.de 10 > /tmp/before.txt
# ... Optimierungen durchführen ...
# Nach Optimierung
python3 straceanalyse.py shop.de 10 > /tmp/after.txt
# Vergleichen
diff /tmp/before.txt /tmp/after.txt
```
---
## 🐛 Troubleshooting
### Problem: "Keine PHP-FPM Prozesse gefunden"
**Ursache**: Falsche Domain oder keine aktiven Worker
**Lösung**:
```bash
# Prüfen welche Pools existieren
systemctl list-units | grep plesk-php
# Domain-Name exakt wie in Plesk verwenden
ps aux | grep php-fpm | grep pool
```
### Problem: "Keine Syscalls aufgezeichnet"
**Ursache**: Shop hat gerade wenig Traffic
**Lösungen**:
```bash
# 1. Längere Duration
python3 straceanalyse.py shop.de 20
# 2. Traffic generieren (anderes Terminal)
for i in {1..50}; do curl -s https://shop.de/ > /dev/null & done
# 3. Zu Peak-Zeiten wiederholen
```
### Problem: "Permission denied" bei strace
**Ursache**: Keine Root-Rechte
**Lösung**:
```bash
# Als root ausführen
sudo python3 straceanalyse.py shop.de 10
# Oder mit sudo prefix im Script
```
### Problem: Script hängt/läuft sehr lange
**Ursache**: Zu viele Prozesse oder zu lange Duration
**Lösung**:
```bash
# Prozesse limitieren
python3 straceanalyse.py shop.de 5 10
# Script abbrechen: Ctrl+C
# Bereits gesammelte Daten bleiben erhalten
```
### Problem: "unknown" bei Script-Context
**Ursache**: Prozess war idle oder konnte Context nicht auslesen
**Bedeutung**:
- Normal bei idle Workers
- Keine Aktion nötig wenn nur wenige "unknown"
- Bei vielen "unknown": Längere Duration probieren
---
## 🔬 Technische Details
### Funktionsweise
1. **Prozess-Discovery**: Findet alle PHP-FPM-Worker via `ps aux`
2. **Context-Extraktion**: Liest `/proc/$pid/environ` für REQUEST_URI und SCRIPT_FILENAME
3. **Syscall-Tracing**: Führt `strace` mit Timeout auf jeden Prozess aus
4. **Pattern-Matching**: Analysiert strace-Output mit Regex-Patterns
5. **Context-Mapping**: Verknüpft fehlende Dateien mit PHP-Scripts
6. **Multi-Format-Export**: Generiert 7 verschiedene Output-Dateien
### Strace-Parameter
```bash
strace -p $PID \ # An Prozess anhängen
-f \ # Child-Prozesse folgen
-s 500 \ # String-Länge auf 500 Zeichen
-e trace=all\ # Alle Syscalls tracen
-T # Zeit pro Syscall anzeigen
```
### Performance-Impact
- **CPU**: ~2-5% pro Worker während Trace
- **Memory**: ~50MB für Script + Daten
- **Shop-Impact**: Minimal (< 1% Latenz)
- **Duration**: 5 Sekunden = ~0 bemerkbar
### Limitierungen
- **Idle-Workers**: Keine Daten wenn Prozess nichts tut
- **Context-Loss**: Bei sehr kurzen Requests
- **Root-Requirement**: Muss als root laufen
- **Plesk-Specific**: Für andere Setups Anpassungen nötig
---
## 🤝 Contributing
Beiträge sind willkommen!
### Workflow
1. Issue erstellen: [Issues](https://git.jtl-hosting.de/thomasciesla/deep-shop-strace-analyse/issues)
2. Branch erstellen: `git checkout -b feature/deine-feature`
3. Änderungen committen: `git commit -am 'Add feature'`
4. Push: `git push origin feature/deine-feature`
5. Pull Request: [Pull Requests](https://git.jtl-hosting.de/thomasciesla/deep-shop-strace-analyse/pulls)
### Code-Style
- **PEP 8** für Python-Code
- **Docstrings** für alle Funktionen
- **Type Hints** wo möglich
- **Kommentare** für komplexe Logik
### Testing
```bash
# Grundfunktion testen
python3 straceanalyse.py test-shop.de 3 5
# Ausgabe-Dateien prüfen
ls -la /root/shop_analysis_*/
# CSV-Format validieren
python3 -c "import csv; list(csv.reader(open('/root/shop_analysis_*/missing_files.csv')))"
```
---
## 📧 Kontakt
**Maintainer**: Thomas Ciesla
**Email**: [thomas.ciesla@jtl-software.com](mailto:thomas.ciesla@jtl-software.com)
**Teams**: thomas.ciesla@jtl-software.com
**Issues**: [GitHub Issues](https://git.jtl-hosting.de/thomasciesla/deep-shop-strace-analyse/issues)
---
## 📄 License
Copyright © 2025 JTL-Software GmbH
Dieses Tool ist für den internen Gebrauch bei JTL-Software entwickelt.
---
## 🙏 Danksagungen
- **JTL-Shop Team** für die Shop-Architektur
- **Plesk** für das Multi-PHP-Pool-System
- **Linux strace** für das mächtige Tracing-Tool
---
## 📝 Changelog
### Version 1.0.0 (2025-10-27)
- Initial Release
- 🔍 PHP-FPM Prozess-Analyse
- 📁 Fehlende-Dateien-Detection
- 🔗 Script-Context-Mapping
- 📊 Multi-Format-Export
- 🚀 Parallel-Processing
- 📈 Progress-Tracking
---
**Happy Debugging! 🐛🔍**