PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SMP Verhalten von Linux



Berufspenner
14.04.03, 21:40
Hi@all

Ich wollte mal wissen, ob man unter Linux Software extra für SMP Maschienen coden muss oder ob der Kernel da über ein inetligentes Management verfügt? Unter W2k z.B. benötigt man ja extra Software die den SMP Betrieb unterstützt.

Cu
André

HackThor
14.04.03, 22:06
Hi!

Unter Linux ist es genauso (Q3A ist da ein gutes Beispiel - das unterstüzt SMP, aber nicht in allen Versionen... gab zwischenzeitlich Probleme, außerdem muß es der SMP-Support beim Start eingeschaltet werden).
Es gibt da eigentlich nur weniges zu beachten:
- du brauchst mehrere Threads - Linux kann nicht ein einzelnes Programm auf mehreren CPUs laufen lassen, andere Systeme übrigens auch nicht (obwohl ich mir da z.B. bei der IBM zSeries nicht so sicher wäre... keine Ahnung wie das Programm das sieht wenn dynamisch zusätzliche CPUs zugewiesen werden)
- du mußt für die Threads per Mutex/Semaphoren/Locks etc. den Zugriff auf die gemeinsamen Daten/Speicherbereiche managen - damit immer nur einer drauf zugreift (egal ob lesend oder schreibend - wenn einer grad schreibt und ein anderer gleichzeitig liest hast du eine "race condition" fabriziert, und diese sind richtig eklig da nur schwer reproduzierbar)
Den Rest machen Kernel und glibc für dich.

Google wird dir bestimmt mit weitergehenden Infos helfen.

ciao

Michael

HirschHeisseIch
14.04.03, 22:06
Der/Die CPU´s werder vom Kernel angesprochen. Wenn der SMP aktiviert hat, dann rennen beide ;) Ob die Software extra gecodet werden muss weiss ich nicht, kanns mir aber nicht vorstellen.

HackThor
14.04.03, 22:09
@HirschHeisseIch:

Ja, die Software muß (wie angesprochen) extra programmiert werden. Beispiele dafür sind der hlds und Q3A - während Q3A mit aktiviertem SMP-Support (glaube dank Threads) auf beiden CPUs läuft so ist der hlds (leider) auf eine CPU "festgenagelt". Mußte ich leider feststellen als ich vor Jahren mal testweise ein Dual-Board unter Linux laufen hatte (das legendäre Abit BP-6 mit 2 Celerons :D ).

ciao

Michael

derRichard
14.04.03, 22:22
hallo!

sagen wir mal ich schreibe in c ein programm mit einer endlosschleife und kompiliere das dann auf meiner smp-maschine.
nutzt mein c-programm dann nur eine cpu oder alle?

//richard

Berufspenner
14.04.03, 22:32
Hi@all

Danke für die Infos. Wie sieht es da denn mit der meisten Serversoftware wie Apache und die gängigen FTP-Server bzw. Datenbankserver aus? Sind die auf die SMP Architektur ausgerichtet? Kennt wer evtl. gute, am besten deutschsprachige seiten von SMP und 64Bit Systeme in Verbindung mit C++ angesprochen oder behandelt werden?

Cu
André

Jasper
15.04.03, 09:42
Original geschrieben von derRichard
hallo!

sagen wir mal ich schreibe in c ein programm mit einer endlosschleife und kompiliere das dann auf meiner smp-maschine.
nutzt mein c-programm dann nur eine cpu oder alle?


ein prozess == eine cpu. giklt auch für threads, weil threads vereinfachte prozesse sind.

-j

marcdevil
15.04.03, 10:42
und wenn man zwei Programme startet, die nicht extra an SMP angepasst wurden ? Macht der SMP-Linux-Kernel beide Programme auf die erste CPU, oder belegt jedes Programm eine andere CPU ?

Jasper
15.04.03, 10:56
Original geschrieben von marcdevil
und wenn man zwei Programme startet, die nicht extra an SMP angepasst wurden ? Macht der SMP-Linux-Kernel beide Programme auf die erste CPU, oder belegt jedes Programm eine andere CPU ?

per default gibt es keine feste zuordnung von prozess -> cpu, sogenannte cpu-affinität.
kann aber per patch nachgerüstet werden.

d.h. der scheduler verteilt die timeslices, nicht die prozesse auf die cpus, so dass jede cpu die gleiche anzahl an arbeit erhält.

-j

Berufspenner
15.04.03, 11:00
Hi@all

Also soweit ich das richtig verstehe, arbeitet mein Server trotz SMP-Kernel nur wirklich mit einer CPU und die andere ist eigentlich mehr stanby, oder?

Cu
André

bernie
15.04.03, 11:27
Hi,

das siehst du in /proc/interrups, da müssten beide CPUs etwa die gleiche Anzahl anzeigen:


# cat /proc/interrupts
CPU0 CPU1
0: 1373008408 1372138293 IO-APIC-edge timer
1: 3775 3859 IO-APIC-edge keyboard
2: 0 0 XT-PIC cascade
8: 3 2 IO-APIC-edge rtc
10: 473626179 473565101 IO-APIC-level eth0
12: 25061332 25036577 IO-APIC-level Mylex AcceleRAID 170
14: 1345 1195 IO-APIC-edge ide0
NMI: 0 0
LOC: 2745278091 2745278090
ERR: 0
MIS: 605

EDIT:
daran siehst du zumindest ob der Kernel beide CPUs verwendet,.. genaueres kann ich nicht sagen.
Ahja, die Maschine läuft schonr echt lang daher die grossen Zahlen.



# uptime
12:29:14 up 317 days, 17:26, 2 users, load average: 0.06, 0.13, 0.19


Ciao, Bernie

Jasper
15.04.03, 11:58
Original geschrieben von Berufspenner
Also soweit ich das richtig verstehe, arbeitet mein Server trotz SMP-Kernel nur wirklich mit einer CPU und die andere ist eigentlich mehr stanby, oder?


nein, wie kommst du denn darauf?

wie ich bereits schrieb, verteilt der scheduler die timeslices auf die vorhandenen prozessoren.
hast du smp, werden (rein theoretisch) doppelt soviele slices abgehandelt, bsp:

komprimiere auf einer UP-maschine zwei files mit bzip2 => %cpu = 50% für jedes bzip2

das gleiche auf einer smp-maschine => 100% pro bzip2

in dem beispiel stehen 2 bzip2 in der runqueue (alle anderen prozesse werden der einfachheit vernachlässigt) und warten auf abarbeitung. bei einem prozessor muss das jeweils andere bzip2 warten, bis die zeitscheibe des vorhergehenden vorbei ist. bei smp dagegen werden die zeitscheiben der beiden prozesse parallel abgearbeitet.

-j

Berufspenner
15.04.03, 11:58
Hi@all
dualserver:~# cat /proc/interrupts
CPU0 CPU1
0: 469300 476961 IO-APIC-edge timer
1: 2 0 IO-APIC-edge keyboard
2: 0 0 XT-PIC cascade
10: 572464 573929 IO-APIC-level eth0
11: 5515 5458 IO-APIC-level aic7xxx
14: 38 14 IO-APIC-edge ide0
NMI: 0 0
LOC: 946294 946292
ERR: 0
MIS: 0
Sieht also so aus, als ob beide CPU's relativ gleichmässig beansprucht werden.

Cu
André

Jasper
15.04.03, 12:07
Original geschrieben von Berufspenner
Sieht also so aus, als ob beide CPU's relativ gleichmässig beansprucht werden.


solange man nur die hardware-ints betrachtet, stimmt die aussage. /proc/interrupts sagt aber nichts über den tatsächlichen load aus. wenn du es genau wissen willst, installier dir 'sar', da wird für jede CPU detailliert protokolliert:

# sar -U ALL

12:50:00 PM CPU %user %nice %system %idle
01:00:00 PM 0 18.42 0.00 5.98 75.60
01:00:00 PM 1 18.22 0.00 5.75 76.03
01:00:00 PM 2 20.54 0.00 6.77 72.69
01:00:00 PM 3 19.64 0.00 6.14 74.22
01:00:00 PM 4 21.20 0.00 6.72 72.09
01:00:00 PM 5 40.34 0.00 6.42 53.23
01:00:00 PM 6 19.46 0.00 6.40 74.14
01:00:00 PM 7 20.65 0.00 6.75 72.60
Average: 0 18.42 0.00 5.98 75.60
Average: 1 18.22 0.00 5.75 76.03
Average: 2 20.54 0.00 6.77 72.69
Average: 3 19.64 0.00 6.14 74.22
Average: 4 21.20 0.00 6.72 72.09
Average: 5 40.34 0.00 6.42 53.23
Average: 6 19.46 0.00 6.40 74.14
Average: 7 20.65 0.00 6.75 72.60

-j

bernie
15.04.03, 12:17
Hi,

wo ist sar dabei? Wenn ich apt-get install sar eintippe bekomme ich, searchandrescue, ein Spiel.

Ciao, Bernie

Jasper
15.04.03, 12:22
Original geschrieben von bernie
wo ist sar dabei? Wenn ich apt-get install sar eintippe bekomme ich, searchandrescue, ein Spiel.


bei redhat ist es paket sysstat, wo es bei debian ist, keine ahnung. auf der debian-site konnte man glaube ich pakete nach binaries durchsuchen.

-j

Berufspenner
15.04.03, 12:31
Hi@all

Unter Debian ist es auch das Packet 'sysstat'. Mein Ergebnis
dualserver:~# sar -P ALL
Linux 2.4.20 (dualserver) 04/15/03

13:24:44 CPU %user %nice %system %iowait %idle
13:25:01 all 1.23 0.00 0.76 0.00 98.01
13:25:01 0 0.06 0.00 0.62 0.00 99.33
13:25:01 1 2.40 0.00 0.89 0.00 96.70
Average: all 1.23 0.00 0.76 0.00 98.01
Average: 0 0.06 0.00 0.62 0.00 99.33
Average: 1 2.40 0.00 0.89 0.00 96.70
Cu
André

netzmeister
15.04.03, 12:54
Hallo,

normalerweise macht das SMP der Kernel. Hier z.B. die Ausgabe des Linuxforen Servers:

web2:~# cat /proc/interrupts
CPU0 CPU1
0: 748226907 747584558 IO-APIC-edge timer
1: 13915 14064 IO-APIC-edge keyboard
2: 0 0 XT-PIC cascade
8: 84 92 IO-APIC-edge rtc
15: 10782 10174 IO-APIC-edge ide1
17: 67261128 67263807 IO-APIC-level 3ware Storage Controller
18: 237387280 237348571 IO-APIC-level eth0
NMI: 0 0
LOC: 1495829284 1495829283
ERR: 0
MIS: 242
web2:~#

Oder mein Adserver:

www1:~ # cat /proc/interrupts
CPU0 CPU1
0: 35809825 36066144 IO-APIC-edge timer
1: 6 4 IO-APIC-edge keyboard
2: 0 0 XT-PIC cascade
5: 4745517 4744399 IO-APIC-level gdth
8: 0 2 IO-APIC-edge rtc
9: 30 30 IO-APIC-level sym53c8xx, sym53c8xx
10: 17668988 17669114 IO-APIC-level eth0
12: 5 2 IO-APIC-edge PS/2 Mouse
15: 114 117 IO-APIC-edge ide1
NMI: 0 0
LOC: 71885862 71885765
ERR: 0
MIS: 0
www1:~ #

Du passt den Kernel an, danach geht das vollautomatisch.

Viele Grüße

Eicke

derRichard
15.04.03, 13:06
hallo!

jetzt muss ich auch mitmachen :D



richard@server2 richard $ cat /proc/interrupts
CPU0 CPU1
0: 320964621 324840749 IO-APIC-edge timer
1: 1 1 IO-APIC-edge keyboard
2: 0 0 XT-PIC cascade
13: 1 0 XT-PIC fpu
14: 18 17 IO-APIC-edge ide0
15: 7390903 7349238 IO-APIC-edge ide1
16: 8642524 8645291 IO-APIC-level eth0
19: 1581823 1594786 IO-APIC-level aic7xxx
NMI: 0
ERR: 0
richard@server2 richard $ uptime
2:05pm up 74 days, 17:54, 2 users, load average: 0.03, 0.01, 0.00


//richard

quinte17
15.04.03, 14:08
in "top" kann man eigentlich auch die auslastung der beiden cpus sehen (zumindest bei mir so)

greetz
cya