Wie viel Prozesslast verursacht ein python Prozess?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich frage mich, ob es möglich ist, heraus zu finden, wie viel Systemlast ein Python Prozess verursacht.

Hier mal ein Ansatz:

Code: Alles auswählen

import os
import time


start_time = time.time()

#------------------------------------

for i in xrange(10):
    for _ in xrange(600000):
        x = "foo" * 10
        os.times()
    time.sleep(0.1)

#------------------------------------

duration = time.time() - start_time

# os.times() == user time, system time, children's user time, children's system time, and elapsed real time
usage = sum(os.times()[:-1])
idle = duration - usage
load = usage / duration * 100

print "duration..: %.2fsec" % duration
print "usage.....: %.2fsec" % usage
print "idle......: %.2fsec" % idle
print "load......: %.1f%%" % load
Ausgabe:

Code: Alles auswählen

duration..: 4.21sec
usage.....: 3.22sec
idle......: 0.99sec
load......: 76.4%
Macht das Sinn?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

IMHO ist "load" *bestenfalls* ein Verhältnis aus usage vs. duration, das den System- bzw. Interpreteroverhead wiederspiegelt, denn der CPU-load während der ausgeführten Zeit sollte ja 100% sein - es sei denn es gibt Wartezeit, dann allerdings macht die Antwort, die "load" gibt wieder Sinn (so wie in Deinem Beispiel). Außerdem müßte man - je nachdem, was man ermitteln möchte - os.times() auch vor dem zu messenden Abschnitt ausführen. Aber das ist wohl eher einer philophische Frage. Je nachdem wie man die beantwortet, kann man dann auch wieder meinem ersten Satz widersprechen. (Etwas verwirrend geschrieben, wie mir gerade auffällt ...)

Kennst Du psutil?

Gruß,
Christian
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

CM hat geschrieben:IMHO ist "load" *bestenfalls* ein Verhältnis aus usage vs. duration, das den System- bzw. Interpreteroverhead wiederspiegelt, denn der CPU-load während der ausgeführten Zeit sollte ja 100% sein
Ja, da hast du recht.

Naja, also mir geht es eigentlich um https://github.com/jedie/django-processinfo um heraus zu finden, wie viel System last eine Web-App so erzeugt...

Dabei hatte ich halt die Idee, die Dauer im Verhältnis zu "usage" zu setzten. Natürlich wäre es gut, wenn der CPU-Load 100% ist. Aber ein Webserver hat ja i.d.R. mehr zu tun ;)

Mit anderen Worten: Wenn es nur diesen einen Python Prozess gibt, dann mach usage vs. duration keinen Sinn. Aber im Multitasking Umgebung mit mehreren laufenden Prozessen, kann usage vs. duration doch den "load" angeben?
CM hat geschrieben:Außerdem müßte man - je nachdem, was man ermitteln möchte - os.times() auch vor dem zu messenden Abschnitt ausführen. Aber das ist wohl eher einer philophische Frage.
Das verstehe ich nicht ganz. Denn os.times() liefert beim starten eigentlich nur den Aktuellen Zeitpunkt, also sowas hier:

Code: Alles auswählen

(0.015600099999999999, 0.015600099999999999, 0.0, 0.0, 0.0)
CM hat geschrieben:Kennst Du psutil?
Ja, das ist nett. Aber das meiste ist in C geschrieben...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

jens hat geschrieben: Dabei hatte ich halt die Idee, die Dauer im Verhältnis zu "usage" zu setzten. Natürlich wäre es gut, wenn der CPU-Load 100% ist. Aber ein Webserver hat ja i.d.R. mehr zu tun ;)

Mit anderen Worten: Wenn es nur diesen einen Python Prozess gibt, dann mach usage vs. duration keinen Sinn. Aber im Multitasking Umgebung mit mehreren laufenden Prozessen, kann usage vs. duration doch den "load" angeben?
Prinzipiell ja. Wenn man sehr präzise sein will (das ist u. U. nicht Dein Anliegen), muß man halt höllisch auf Synchronisation und locks aufpassen.
jens hat geschrieben:
CM hat geschrieben:Außerdem müßte man - je nachdem, was man ermitteln möchte - os.times() auch vor dem zu messenden Abschnitt ausführen. Aber das ist wohl eher einer philophische Frage.
Das verstehe ich nicht ganz. Denn os.times() liefert beim starten eigentlich nur den Aktuellen Zeitpunkt, also sowas hier:

Code: Alles auswählen

(0.015600099999999999, 0.015600099999999999, 0.0, 0.0, 0.0)
Sorry, da hatte ich die Doku falsch verstanden, jetzt habe ich es auch gesehen.
jens hat geschrieben:
CM hat geschrieben:Kennst Du psutil?
Ja, das ist nett. Aber das meiste ist in C geschrieben...
Und?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also ich hab das mal in django-processinfo eingebaut...

Sieht dann ungefähr so aus:

Code: Alles auswählen

Total processor time (user/system/total)
    6.6 sec / 810.0 ms / 7.4 sec
Total response time
    9.6 sec
Loads (response time in relation to processor time)
    76.4% (Higher percent is better) 
Sollte der "loads" wert zu sehr sinken, stimmt dann wohl was nicht ganz ;)

Hatte auch überlegt die gemessenen Werte in relation zu den Werten aus /proc/stat zu setzten. Aber mir ist nicht so ganz klar, wie das am besten Sinn macht...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten