Deep Shop strace Analyse
Ein leistungsstarkes Python-Tool zur Performance-Analyse von JTL-Shop-Instanzen durch systematisches Tracing von PHP-FPM-Prozessen.
📋 Inhaltsverzeichnis
- Überblick
- Features
- Voraussetzungen
- Installation
- Verwendung
- Ausgabe-Dateien
- Beispiele
- Troubleshooting
- Technische Details
- Contributing
- 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
# System-Pakete
apt-get install strace python3
# Python-Module (Standard-Library)
# Keine zusätzlichen pip-Pakete erforderlich!
🚀 Installation
1. Repository klonen
git clone https://git.jtl-hosting.de/thomasciesla/deep-shop-strace-analyse.git
cd deep-shop-strace-analyse
2. Script ausführbar machen
chmod +x straceanalyse.py
3. Test-Run
python3 straceanalyse.py --help
💻 Verwendung
Basis-Syntax
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
# 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
# Bei hoher Last: Kurze Duration, viele Prozesse
python3 straceanalyse.py high-traffic-shop.de 3 50
Low-Traffic-Shop analysieren
# Bei wenig Traffic: Längere Duration für mehr Daten
python3 straceanalyse.py low-traffic-shop.de 15
Kontinuierliches Monitoring
# Alle 5 Minuten analysieren
watch -n 300 'python3 straceanalyse.py mein-shop.de 5 10'
Output in Log-Datei
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.
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.
#!/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
# 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
# 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
#!/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
# 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:
# 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:
# 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:
# 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:
# 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
- Prozess-Discovery: Findet alle PHP-FPM-Worker via
ps aux - Context-Extraktion: Liest
/proc/$pid/environfür REQUEST_URI und SCRIPT_FILENAME - Syscall-Tracing: Führt
stracemit Timeout auf jeden Prozess aus - Pattern-Matching: Analysiert strace-Output mit Regex-Patterns
- Context-Mapping: Verknüpft fehlende Dateien mit PHP-Scripts
- Multi-Format-Export: Generiert 7 verschiedene Output-Dateien
Strace-Parameter
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
- Issue erstellen: Issues
- Branch erstellen:
git checkout -b feature/deine-feature - Änderungen committen:
git commit -am 'Add feature' - Push:
git push origin feature/deine-feature - Pull Request: Pull Requests
Code-Style
- PEP 8 für Python-Code
- Docstrings für alle Funktionen
- Type Hints wo möglich
- Kommentare für komplexe Logik
Testing
# 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
Teams: thomas.ciesla@jtl-software.com
Issues: GitHub 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! 🐛🔍