Messung der Ressourcennutzung durch Skript über `subprocess.run` gestartet
Posted: 21 Feb 2025, 23:13
Ich erstelle einen Dienst, mit dem Benutzer ihren Python -Code ausführen und das Ausführungsergebnis zurückholen können (yay, eine Art Lambda). Mein Problem ist, dass ein bestimmtes Skript böswillig sein kann, und, wenn auch ein Netzwerk ausgeschaltet ist, können diese oder diese Variationen von RM -Rf stattfinden. Der Service funktioniert wie folgt: < /p>
Problem ist, ich möchte nicht nur Um das Skript selbst auszuführen, aber auch Ressourcen zu zeigen, die mehr oder weniger genau verwendet haben. Die einfachste Lösung wäre, Zeit zu schreiben. > Die tatsächliche Skriptausführungszeit ist x% niedriger. Gleiches gilt für die Verwendung von Ressourcen lib. subprocess.run ? gefolgt von endlosen WTF-Momenten sowie zusätzlichem Busybox-Container und einer weiteren Packung von WTF-Momenten, sodass eine Python-Lösung viel besser ist. Ja, ich weiß, dass die Messfehlerrate für nur Python-Lösung nicht nur Ziel -Betriebssystem: Linux
- Skript gesendet vom Benutzer, < /li>
RO K8S < /code> Pod für Ausführung des Benutzerskripts (mit Wrapper -Skript unten) In Manager, - Die Ausführung des Skripts in Pod beginnen und bis zum Ende/Zeitübergang warten,
- Return Exec -Ergebnis (Was ist in STDOut , stderr ) + metriken an Manager,
- Prozessausgabe im Manager,
- POD löschen (AVG -Lebensdauer von Pod IS 1..7S ),
- Die verarbeitete Ausgabe als JSON an den Benutzer zurückgeben,
Problem ist, ich möchte nicht nur Um das Skript selbst auszuführen, aber auch Ressourcen zu zeigen, die mehr oder weniger genau verwendet haben. Die einfachste Lösung wäre, Zeit zu schreiben. > Die tatsächliche Skriptausführungszeit ist x% niedriger. Gleiches gilt für die Verwendung von Ressourcen lib. subprocess.run ?
Code: Select all
import time, resource, subprocess, sys, json
start = time.time()
timeout = 5 # 5 seconds exec timeout
exit_code = 0
try:
# /scripts/script.py - with actual user code, its resource usage I want to measure
result = subprocess.run(['python', '/scripts/script.py'],
timeout=timeout,
check=True,
capture_output=True,
text=True)
print(result.stdout, end='')
if result.stderr:
print(result.stderr, file=sys.stderr, end='')
except subprocess.TimeoutExpired:
exit_code = 124
except subprocess.CalledProcessError as e:
if e.stdout:
print(e.stdout, end='')
if e.stderr:
print(e.stderr, file=sys.stderr, end='')
exit_code = e.returncode
end = time.time()
elapsed = end - start
usage = resource.getrusage(resource.RUSAGE_CHILDREN)
cpu_time_used = usage.ru_utime + usage.ru_stime
cpu_usage_m = (cpu_time_used / elapsed) * 1000 if elapsed > 0 else 0
memory_used_mi = usage.ru_maxrss / 1024.0
metrics = {{
"execution_time": round(elapsed, 2), # in seconds
"cpu_usage": round(cpu_usage_m, 2), # in m
"memory_usage": round(memory_used_mi, 2), # in Mi
"exit_code": exit_code
}}
print("\\n###METRICS###")
print(json.dumps(metrics))
sys.exit(0)
< /code>
Zusätzlicher Kontext: < /p>
Ich bin kein großer Fan von Bash -Programmierung mit Mist wie $ {14+ 15}