Autor Thema: Anzahl der Prozessoren unter Linux bestimmten  (Gelesen 12383 mal)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« am: 01. March 2010, 21:14 »
Nabend zusammen,

ich versuche gerade herauszufinden, wie man unter Linux die Anzahl der Prozessoren bestimmen kann.
Unter cpuinfo findet man ja nur die Anzahl der CPUs.

Gibt es da eine einfache Möglichkeit, die ich vllt sogar ganz einfach durch ein eigenes Modul?

Danke.

Gruß
Sven
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. March 2010, 21:49 »
Wie wäre es mit "cat /proc/cpuinfo" ?

Oder bringst du etwas durcheinander? Prozessoren und CPUs sind identisch ... und damit zu unterscheiden von Kernen/Cores (=mehrere unabhängige CPUs auf einem Chip) und Hyperthreads (=mehrere voneinander abhängige, sich also u.U. blockierende CPUs auf einem Chip); beides kann auch gemeinsam auftreten (also Mehrkern, wobei jeder Kern wieder Hyperthreading bietet).

Wenn du die Anzahl der verbauten Prozessormodule haben möchtest, dann sollte sich das aus der /proc/cpuinfo rauslesen lassen, indem man abzählt, wieviele virtuelle CPUs es gibt und wieviele davon pro Chip enthalten sind.

Ansonsten mal mit "dmesg" nachschauen; ein "dmesg | grep CPU" liefert bei mir auch ein paar Informationen.

Gruß,
Svenska

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. March 2010, 22:09 »
ABer soweit ich weiß, wertet Linux die Anzahl der CPUs und Cores anhand der ACPI-Tabelle.
In der ACPI-Tabelle stehen zum Teil die einzelnen Cores auch als CPUs drin.
Das würde bedeuten, dass das dann falsch wäre.
Außerdem steht bei einer Quad-Core-Maschine in der cpuinfo vier mal die CPU drin.
Dann würde das bedeuten, dass die Mashine vier verschiedene Prozessoren enthält aber es ist nur eine mit 4 CPUs.

Das ist gerade mein Problem.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. March 2010, 22:20 »
Ein Prozessor ist eine CPU. Ob die nun auf einem Chip verbaut wurden oder nicht, ist für das System unerheblich. Ein QuadCore erscheint gegenüber dem System als vier einzelne CPUs, die sich genau so verhalten, wie es in einem System, wo vier einzelne Prozessormodule verbaut sind.

Das heißt im Umkehrschluss, dass deine QuadCore-Maschine wirklich vier Prozessoren enthält, die sind aber baugleich.

Wenn du die Anzahl der Prozessormodule suchst, dann wirst du um das Abgleichen der Typnummer nicht herumkommen (mein T5500 ist immer ein Core2 Duo). Eventuell gibt es bei verschiedenen Modulen noch eine Extra-Kennzeichnung, das weiß ich nicht.

Gruß,
Svenska

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 01. March 2010, 22:25 »
Okay.
Ich muss das halt ganz genau wissen, damit ich die NUMA-Prozessoren ordentlich abarbeiten kann.
Dachte, dass Linux da vllt besser differenzieren kann.

Danke
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 01. March 2010, 22:27 »
Wenn das BIOS (bzw. die Firmware) nicht genauer differenziert/differenzieren kann, dann bringt das wahrscheinlich wenig. ;-)

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 02. March 2010, 20:29 »
Hallo,


Linux sollte die exakte CPU-Struktur (Sockel/Core/Thread) auf der x86-Plattform schon etwas genauer analysieren können, das ist schließlich auch für die Opteronen (seit 7 Jahren) relevant.

So weit ich weiß verfügt der Scheduler im Linux-Kernel über genaue Infos. Das ist z.B. auch auf dem Core 7 wichtig, dort kann ein Kern nur dann schlafen (um anderen Cores mehr Takt zu ermöglichen) wenn beide HyperThreading-Parts nichts zu tun haben. Auch ist der lokale RAM (der einem bestimmten Sockel gehört) mit kürzerer Latenz erreichbar, wenn ich mich recht erinnere hat AMD damals etwas Zeit/Code in den Linux-Kernel investiert um diesem zu ermöglichen das Threads möglichst auf einer CPU (Sockel) laufen welche dem RAM möglichst nah ist.

Für die von Dir gewünschten Infos gibt es sicher eine passende Kernel-Schnittstelle, vielleicht im ProcFS o.ä., vielleicht schaust Du Dich auch im Scheduler-Interface um.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Tobiking

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 03. March 2010, 08:04 »
Also bei mir steht in /proc/cpuinfo zu jedem virtuellen Prozessor eine physical id und eine core id. Mit der core id sind die Kerne durchnummeriert und die physical id gibt an zu welcher CPU der Kern gehört. Ich bin mir nur nicht sicher ob und wie sich Hyperthreading dort bemerkbar macht.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 03. March 2010, 11:36 »
Hallo,


Ich bin mir nur nicht sicher ob und wie sich Hyperthreading dort bemerkbar macht.
Zumindest Physical-ID und Core-ID sollten identisch sein, vielleicht gibt es dann ja noch eine Thread-ID oder was ähnliches.

Eigentlich sollte Linux sogar in der Lage sein die exakte Topologie der CPU-Verbindungen zu erkennen. Auf einem 8-Sockel-Opteron ist ja z.B. nicht jeder Sockel mit jedem verbunden und es können bis zu 4 Hops erforderlich sein um an bestimmten RAM zu gelangen. Das alles sollte der Linux-Kernel eigentlich erkennen können. Bei den Opterons gibt es dafür passende Register mit dehnen das Routing geregelt ist, bei den aktuellen Core i7 und darauf aufbauenden Xeons gibt es sicher ähnliche Dinge.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 03. March 2010, 12:07 »
Ah, danke.
Kommt davon wenn man Linux nur auf der VM mit einem Core betreibt.
Da stand nichts von physical-id und core-id.
So lässt sich das ganze ja extrem leicht parsen.

Dachte schon, dass man das nicht herausbekommt
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

 

Einloggen