FreeBSD und Python Threads

Daemotron

Well-Known Member
Moin,

ich habe mir ein kleines Python-Programm zusammengeschraubt, das mit mehreren Worker-Threads arbeitet. Was mir aufgefallen ist: Wenn ich das Programm auf einem Multi-Core System mit 2 Worker-Threads starte, wird trotzdem nur ein CPU-Kern ausgenutzt (allerdings abwechselnd mal der eine, mal der andere). Ein Worker-Thread bleibt in Status S, obwohl ein Kern ja frei wäre (es werden beide Threads ausgeführt, aber eben nicht parallel).

Das schaut dann so aus:
Code:
USER      PID %CPU %MEM   VSZ   RSS  TT  STAT STARTED      TIME COMMAND
jfreund 72687 44.0  0.6 69836 53832  ??  R<    9:01PM 585:11.33 python ./primaton.py -w 2 -d -p primaton.pid -e INFO
jfreund 72687 16.0  0.6 69836 53832  ??  S<    9:01PM 506:59.75 python ./primaton.py -w 2 -d -p primaton.pid -e INFO
jfreund 72687  0.0  0.6 69836 53832  ??  I<    9:01PM  19:00.13 python ./primaton.py -w 2 -d -p primaton.pid -e INFO

So schaut das System aus:
Code:
hw.machine: amd64
hw.model: AMD Athlon(tm) 64 X2 Dual Core Processor 6000+
hw.ncpu: 2
hw.machine_arch: amd64
Installiert ist FreeBSD 7.1 (amd64) mit SCHED_ULE. Python ist in Version 2.5 aus den Ports installiert, Threads sind aktiviert.

Wenn man das Programm mit Loglevel DEBUG startet, sieht man auch recht deutlich, dass über längere Zeit immer nur ein Thread aktiv ist und sich aus der Queue bedient. Irgendwann wird dann zum nächsten Thread gewechselt, und das Spielchen wiederholt sich.

Was ich nicht so ganz verstehe: Angeblich soll FreeBSD 7 in der Lage sein, mehrere Threads auch auf mehrere CPU-Kerne zu verteilen. Leider habe ich kein anderes SMP-System im Zugriff, so dass ich nicht mal einfach mit einem anderen OS testen kann, wie dort die Threads gescheduled werden. Hat von Euch vielleicht jemand eine Idee, einen Hinweis oder einen Link, wie ich der Sache noch nachgehen kann? Falls jemand selber experimentieren möchte, habe ich das Programm als Anhang beigefügt.
 

Anhänge

  • primaton.zip
    5,5 KB · Aufrufe: 209
Das ist leider ganz normal. Der Python Interpreter hat einen Big Giant Lock. Die Threads aus threading.Thread(...) taugen eigendlich nur, um blockierende IO Operation zu kaschieren.
 
Es gibt eine Option THREADS in den Python Ports. Ist die aktiviert?
Yep, die ist an. Wie gesagt, es werden ja auch Threads erzeugt (sichtbar mit ps -Hux) - nur lässt der Scheduler sie nicht parallel zur Ausführung kommen. Ich bekomme bei zwei Kernen immer exakt 50% CPU-Auslastung angezeigt, und einer der beiden Threads hängt jeweils im Status S.

hippodriver schrieb:
Der Python Interpreter hat einen Big Giant Lock.
Sowas in der Art hatte ich befürchtet :( Muss ich wohl doch auf C ausweichen...
 
Es gibt aber auch eine gute Nachricht: mit dem neuen multiprocessing-Modul (ab Python 2.6) dürfte das Problem wohl erledigt sein (auch wenn Threads anstelle von Prozessen hübscher gewesen wären...)
 
Zurück
Oben