Re: Wert von MAXCPU in C auf amd64 (prometheus cpu collector)

From: Peter <pmc(at)citylink.dinoex.sub.org>
Date: Sat, 3 Dec 2016 04:13:13 +0100

Marian Hettwer wrote:
> Hallo Liste,
>
>
> ich knobel an einer compile Frage, in die ich reingestolpert bin,
> nachdem ich mir Prometheus auf meinem Server installiert habe.
> Der Autor des cpu collectors probiert scheinbar rauszubekommen, wie groß
> die maximale Anzahl an CPUs ist.
>
> https://github.com/prometheus/node_exporter/blob/master/collector/cpu_freebsd.go#L106
>
>
> Zeile 109: const maxCPUTimesLen = C.MAXCPU * C.CPUSTATES
>
>
> MAXCPU ist wohl als konstante in /usr/include/machine/params.h
> definiert. Unter amd64, wenn SMP definiert ist, dann 64, else 1.
> Was mich wundert ist, dass auf meinem 10.3-RELEASE das ganze im else
> part landet. Obwohl amd64.
>
> [prometheus ~]$ uname -srm
> FreeBSD 10.3-RELEASE-p11 amd64

Jaaa der Compiler fragt ja den cputyp nicht unbedingt live ab, und ein
Userspace programm ist m.E. nicht per default SMP fähig, sondern nur
wenn es spezielle Funktionen dahingehend hat dass es mehrere CPUs
nutzen kann - was der Programmierer dann auch wissen sollte und
entsprechend die Option einschalten kann.

> Das ist ja an sich erstmal löblich.
> Ich finde nur keinen Weg, wie C.MAXCPU auf 64 kommt, ausser über Zeile
> 30 in seinem Code ein '#define SMP 1' reinzuwerfen.
> Aber das kann ja nicht die Lösung sein.
[...]
> Hat jemand ne Idee warum MAXCPU 1 ist, bzw wie man das sauber lösen kann?

Ich würde meinen, das wäre eine Aufgabe für den configure schritt des
Build - dass da erstmal live der Typ der aktuellen Maschine ermittelt
wird und dann ein Headerfile erzeugt, das vor den anderen geladen wird
(oder make optionen formuliert, die an den Compiler übergeben werden).
Und da müsste dann das SMP bei bedarf gesetzt werden:

$ cc main.c
$ a.out
1
$ cc -DSMP main.c
$ a.out
64
$

Ich hab keine Idee inwieweit das auf Dein Produkt anwendbar ist, aber
sowas täte ich mir als saubere Lösung vorstellen. Old school halt.

> Mein workaround mit dem #define SMP 1 macht halt ne große Schüssel.

Warum das, wenn der Code dann tatsächlich mit den aktuellen hw.ncpu
weiterrechnet und das MAXCPU nur zur Überprüfung dient?
MAXCPU ist ja keine Aussage über die aktuell vorhandenen CPUS, sondern
wieviele CPUs die FreeBSD Architektur maximal unterstützen kann.

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sat 03 Dec 2016 - 05:13:28 CET

search this site