Wie verteile ich Applikationen auf einzelne CPUs?

Welches Modul/Treiber für welche Hardware, Kernel compilieren...
Antworten
Benutzeravatar
Simmel
Beiträge: 698
Registriert: 08.03.2004 14:43:43
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Düsseldorf
Kontaktdaten:

Wie verteile ich Applikationen auf einzelne CPUs?

Beitrag von Simmel » 11.04.2006 16:52:09

Ich denke der Text sagt schon alles.

Ich würde ganz gerne dem Apache CPU0 und einer weiteren Anwendung CPU1 spendieren.

Wie komme ich da an mehr Informationen? Ich habe schon viel rumgegoogelt, das meiste was ich finde konnte war aber eher eine Last-Verteilung EINES Programms, auf mehrere CPUs. Daran habe ich allerdings kein Interesse.

Hat hier schonmal jemand so etwas versucht, oder benutzt es vielleicht schon so.

Die 2te App. ist eine kommerzielle SW die auf den Apache aufbaut/mit diesem zusammenarbeitet, diese kann von Haus aus nur eine CPU verwenden, es gibt da auch nicht die Möglichkeit neu zu kompilieren, oder aber eine Varaiante die das ermöglicht.

Deshalb würde ich gerne den Apps jeweils eine CPU spendieren.

Ich hoffe das jemand schon Erfahrungen damit gemacht hat, für mich ist es Neuland und ich bräuchte mal einen Schubs in die richtige Richtung.


Danke für eure Aufmerksamkeit und Hilfe,
Simmel
you've got to know how far to go in going too far

perl -le'print+(split//,"schaeuble")[6,8,7,3,5,0..2,4]'

http://creativecommons.org/licenses/by-nc-sa/2.0/

Benutzeravatar
thorben
Beiträge: 722
Registriert: 14.09.2003 23:23:49

Beitrag von thorben » 12.04.2006 14:26:59

moin,
lass das den kernel machen, der macht das sicht klüger als du ;-)

sind deine cpus im moment nicht gleichmäßig ausgelastet, oder warum versuchst du sowas von hand zu steuern?

gruß
thorben

Benutzeravatar
Simmel
Beiträge: 698
Registriert: 08.03.2004 14:43:43
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Simmel » 12.04.2006 15:50:33

thorben hat geschrieben:moin,
lass das den kernel machen, der macht das sicht klüger als du ;-)

sind deine cpus im moment nicht gleichmäßig ausgelastet, oder warum versuchst du sowas von hand zu steuern?

gruß
thorben
Hmh, vielleicht habe ich mich nicht genügend erkundigt, ich weiss es nicht so genau Thorben.

Mein Verständniss ist so:

Wenn eine Anwendung gleichmässig auf mehrere CPUs verteilt werden soll, dann ist die einzige Möglichkeit die Applikation neu zu kompilieren so das sie dazu ausgelegt ist.

Der Apache hat diese Option, das weiss ich, es ist möglich diesen so neu zu kompilieren.

Das sollte soweit korrekt sein oder?

Ein Top von meiner Kiste (dank Snoopy nun mit Anzeige der 2ten CPU)

Code: Alles auswählen

top - 15:10:49 up 1 day, 21:04,  1 user,  load average: 0.59, 0.72, 0.71
Tasks: 247 total,   9 running, 238 sleeping,   0 stopped,   0 zombie
 Cpu0 : 35.4% us,  3.0% sy,  0.0% ni, 60.3% id,  0.3% wa,  0.0% hi,  1.0% si
 Cpu1 : 42.6% us,  3.0% sy,  0.0% ni, 54.5% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   4106928k total,  2582488k used,  1524440k free,   142508k buffers
Swap:  7815612k total,        0k used,  7815612k free,  1526688k cached
und mal ein Top von einer 2ten Kiste die ich mal als Projekt aufgesetzt hatte

Code: Alles auswählen

124 processes: 122 sleeping, 1 running, 0 zombie, 0 stopped
CPU0 states:  2,1% user,  0,4% system,  0,0% nice, 96,4% idle
CPU1 states:  1,0% user,  1,1% system,  0,0% nice, 97,2% idle
CPU2 states:  0,4% user,  0,3% system,  0,0% nice, 98,3% idle
CPU3 states:  2,3% user,  0,4% system,  0,0% nice, 96,2% idle
Mem:  2064632K av, 1963496K used,  101136K free,       0K shrd,  147708K buf
Swap: 2088440K av,       0K used, 2088440K free                 1565984K cached
zeigt doch eigentlich schon das die CPUs immer unterschiedlich belastet werden, oder habe ich hier einen schweren Denkfehler?

Ich dachte das die Applikationen immer auf die erste CPU zugreifen und erst bei Überlastung oder einer bestimmten Anzahl von zu bearbeitenden Prozessen auf die nächste CPU geschickt werden, oder irre ich mich her? Ich kann leider die Seite momentan nicht mehr finden, wo ich das (meine) gelesen (zu haben). Ich muss Ostern erstmal meine Bookmarksammlung ordnen :roll:

Edit by Snoopy:
Code-Tags für die Leserlichkeit eingefügt.
you've got to know how far to go in going too far

perl -le'print+(split//,"schaeuble")[6,8,7,3,5,0..2,4]'

http://creativecommons.org/licenses/by-nc-sa/2.0/

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 12.04.2006 16:01:06

Was du vorhast geht nicht.

Bei parallel computing auf CPU Ebene wie auch auf Chip Level oder bei SMT [0] wird unter der Voraussetzung das ein SMP [1] Kernelbinary verwendet wird die Lastverteilung von
- Tasks/Prozessen
- Threads
vom Kernel Scheduler gemacht.

Du denkst evtl. eher an das Zusammenspiel von OpenMosix und dem Apachen der forkt - hier migrieren Prozesse über den Cluster . Das ist aber etwas vollkommen unterschiedliches als die Verwendung einer Application auf _einem_ Multiprozessor System (also eine box mit >1 CPU's).

Theoretisch wäre das denke ich machbar was du willst - aber du hättest niemals die Performance als es den die aktuelle Situation (verteilung duch den Scheduler über alle CPU Kerne) ermöglicht - ergo macht man es nicht :idea:

AFAICT muss eine Application auf Prozessebene nicht an ein SMP System angepasst (entsprechend programmiert) sein. Durch NUMA [2] und den SMP Kernel passiert das automatisch. Für SMT ist es aber notwendig das die Application entsprechend gemacht ist.

[0] http://en.wikipedia.org/wiki/Simultaneo ... ithreading
[1] http://en.wikipedia.org/wiki/Symmetric_multiprocessing
[2] http://en.wikipedia.org/wiki/Non-Uniform_Memory_Access

markus

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 13.04.2006 10:08:20

Schau dir mal das Tool taskset an. Damit kann man sowas machen, was du willst.

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 13.04.2006 10:37:01

das ist groovy - wieder etwas gelernt.
taskset ist im paket schedutils zusammen mit chrt
Also geht es doch - was ich oben sagte ist falsch bzw. nur halb wahr. Taskset erreicht eine CPU Affinität.

/Vermutung
hm ... soll heißen im Zweifel lässt der Scheduler den Prozess auf der CPU die der User angibt ABER das letzte Wort hat dann doch nur er was dazu führen kann, dass sollte die Wunsch CPU in Arbeit untergehen doch Prozesse auf die andere(n) CPU(s) verlagert werden
/Vermutung

markus

Benutzeravatar
bse
Beiträge: 468
Registriert: 19.03.2006 19:58:00
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bse » 13.04.2006 12:42:24

Taskset erreicht eine CPU Affinität.

IMHO tendieren beim aktuellen Scheduler alle Tasks dazu auf der CPU zu laufen auf der sie auch zuletzt gelaufen sind. Nur wird halt bei Bedarf vom Kernel-Thread "migration" ein Task auch mal verschoben. Bei Windows ist das übrigens anders, was gelegentlich zu ein paar Problemchen führt, wie auch die c't schon berichtet hat.

Ich würde empfehlen mir um die Lastverteilung keine großen Gedanken zu machen, der Kernel macht das schon richtig. Und Apache läuft sowohl mit prefork als auch mit worker auf mehreren CPUs gleichzeitig, sollte da also auch gut skalieren ;)

Benutzeravatar
Simmel
Beiträge: 698
Registriert: 08.03.2004 14:43:43
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Simmel » 21.04.2006 16:26:38

bse hat geschrieben:Taskset erreicht eine CPU Affinität.
Ich würde empfehlen mir um die Lastverteilung keine großen Gedanken zu machen, der Kernel macht das schon richtig. Und Apache läuft sowohl mit prefork als auch mit worker auf mehreren CPUs gleichzeitig, sollte da also auch gut skalieren ;)
Sorry das ich mich erst so spät melde, aber ich hätte nochmal ein paar Fragen dazu.

In diesem Fall geht es nicht um den Apachen, sondern um eine gekaufte Applikation, die ontop auf dem Apachen arbeitet.

Alles was ich gerne machen würde, wäre diese Applikation testweise auf eine CPU zu begrenzen. Der Apache soll seine Freiheit behalten.

Bei mir im System geistert immer ein toter Apache a.k.a. Zombie durchs System. Ich habe dieses Verhalten beobachtet und festgestellt das es nur im Zusammenspiel mit den Beiden auftaucht. Ich konnte es sogar an den Testservern jederzeit reproduzieren.

Ich habe dann den Support befragt und dort sagte man mir das ich mal versuchen sollte die Applikation nur auf eine CPU zu begrenzen.

Ich würde das gerne mal ausprobieren.

Ist das taskset da dann der richtige Tip?

Hat jemand von euch vielleicht schon einen schlauen Link dazu in seiner Bookmark-Sammlung, bevor ich bei Google die Spreu vom Weizen trenne? :D

Grüße,
Simmel
you've got to know how far to go in going too far

perl -le'print+(split//,"schaeuble")[6,8,7,3,5,0..2,4]'

http://creativecommons.org/licenses/by-nc-sa/2.0/

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 21.04.2006 16:36:49

Simmel hat geschrieben: Ist das taskset da dann der richtige Tip?
Ich denke ja - selber habe ich es noch nicht versucht nur vor 2 wochen oder so das man file angesehen. Einen Link brauchst du nicht.

Code: Alles auswählen

apt-get install schedutils
dann siehe

Code: Alles auswählen

man taskset
markus

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 24.04.2006 10:26:06

Wobei das beim Apache schwierig werden koennte, da der ja neue Prozesse spawnt, wenn er Anfragen bekommt...

Topspeed
Beiträge: 34
Registriert: 10.02.2006 14:08:18

Beitrag von Topspeed » 13.01.2007 18:04:31

hi
ich hätte da auch noch eine frage dazu. auf meinen 2*QuadCore Xeon möchte ich 8 gameserver betreiben und jeden gameserver einer cpu zuweisen. ich habe es versucht mit diesem befehl:

Code: Alles auswählen

screen -AdmS public01 taskset 0x1 /home/public01/source/srcds_run ...
bzw 0x2 für den 2. gameserver, 0x3 für den dritten, 0x4 für 4, 0x5 für 5, ..., 0x8 für 8ten.
jedoch werden nun nur 4 cores belastet und die anderen 4 werden nicht benutzt, bzw <1%.
vielen dank für jegliche Hilfe!

Edit: habs selber rausgefunden. "taskset -c 0" für den ersten core, etc

Antworten