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:
So schaut das System aus:
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.
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
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.