Messung der Ressourcennutzung durch Skript über `subprocess.run` gestartetPython

Python-Programme
Anonymous
 Messung der Ressourcennutzung durch Skript über `subprocess.run` gestartet

Post by Anonymous »

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>
  • 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,
zulässig Die Ausführungszeit für diese Skripte ist auf 5S / Skript beschränkt, daher verwende ich auch Timeout < / code>. Zusätzliche CPU/RAM -Einschränkungen finden ebenfalls statt und werden für den K8S Pod festgelegt. /Code> Param und erhalten das folgende Skript (am Ende), das Parames misst, an denen ich interessiert bin: Zeit verstrichen, CPU verwendet, RAM verwendet. < /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 ?

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} 
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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post