Seite 1 von 1

Wie viel Prozesslast verursacht ein python Prozess?

Verfasst: Montag 29. August 2011, 10:09
von jens
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?

Re: Wie viel Prozesslast verursacht ein python Prozess?

Verfasst: Montag 29. August 2011, 11:55
von CM
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

Re: Wie viel Prozesslast verursacht ein python Prozess?

Verfasst: Montag 29. August 2011, 12:13
von jens
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...

Re: Wie viel Prozesslast verursacht ein python Prozess?

Verfasst: Montag 29. August 2011, 12:33
von CM
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?

Re: Wie viel Prozesslast verursacht ein python Prozess?

Verfasst: Montag 29. August 2011, 14:14
von jens
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...