Es werden nicht alle kerne ausgelastet

Na dann scheint hardware-technisch ja alles in Ordnung zu sein. Das Problem liegt dann wohl an deiner Software. Wenn du uns ein wenig mehr darüber sagen kannst oder Ausschnitte vom Code zeigen kannst, kann man vielleicht was finden.
 
xexex schrieb:
Natürlich kann ein entsprechendes Programm zwischen echten und HT Kernen unterscheiden und die Ausführung auf echte Kerne einschränken.
https://eli.thegreenplace.net/2016/c11-threads-affinity-and-hyperthreading

Ich wage allerdings stark zu bezweifeln, dass dieser Fall hier vorliegt.

Ich habe den Artikel nur ganz grob überflogen.

Einer CPU zu sagen, dass sie nur einen Thread benutzen soll ist das eine. Es ist aber nicht möglich zu sagen, Thread 0 ist der echte und Thread 1 der virtuelle Kern. Das geht nicht.
 
Natürlich kannst du das. Glaubst du ein SQL Server kennt nicht die die Anzahl der physikalischen und logischen Kerne und der NUMA Nodes zu den sie gehören? Es gibt auch diverse APIs die dir solche Informationen liefern.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms683194(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/Dd405488(v=VS.85).aspx

Dann brauchst du nur deinem Programm sagen. nutze nur die Kerne 0,2,4,6 und schon hast du alle HT Kerne raus.
https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-setprocessaffinitymask

Natürlich wird man dies, bei einem einfachen Programm, einfach dem Systemscheduler überlassen. Dieser ist seit Windows XP auch intelligent genug zuerst die "richtigen" Kerne und dann erst die HT Kerne auszulasten. Ändert aber nichts daran, dass man es auch selbst machen kann.
 
Zuletzt bearbeitet:
Nach dem Screenshot scheint ja alles auf der zweiten CPU zu laufen. In welcher Sprache hast du geschrieben?
 
Evtl. hilft dir das Prog "CPU-Control"?
Mit diesem kannst du deiner 2.Instanz die freien Threads zuordnen.
 
@Qarrr³ Ich hab auch noch einen Screenshot wo alles auf der 1. CPU läuft das ist ganz sporadisch

Entwickelt in ANSI-C

Werde mal ein Minimal beispiel schreiben das nur die Core Funktionen beinhaltet das kann ich dann gerne mal zur Verfügung stellen.

Ziel ist es schon für eine Berechnung alle 48 Kerne zu nutzen
 
Hier ein update

Quellcode dazu:


C:
#include <stdlib.h>
#include <stdio.h>
#include <winsock.h>
#include <math.h>
#include <process.h>

static void thread_start(void *thread) {
  int i;
  i = *(int*)thread;
  for (;;) {
    i = (int)sqrt(i++);
  }
}

int main (int argc, char * argv[]) {
  SYSTEM_INFO sysi;
  int thread_max, i;

  argc = argc;
  argv = argv;

  GetSystemInfo(&sysi);
  thread_max = sysi.dwNumberOfProcessors;

  printf("\n... thread_max=%d\n", thread_max);

    printf("\n\n");

  for (i = 0; i < thread_max *2; i++) {
    _beginthread(thread_start, 0, &i);
  }

  for (;;) i = i;

    // return EXIT_SUCCESS;

}
 

Anhänge

  • Screenshot_2018.07.28_13h16m03s_009_.png
    Screenshot_2018.07.28_13h16m03s_009_.png
    262 KB · Aufrufe: 318
Zuletzt bearbeitet:
Ist das zufällig ein HP Server? Das Problem hatte ich letztens auch. Im BIOS kann man einstellen, ob die NUMA nodes in separaten Gruppen oder in einer Gruppe gesteuert werden. In separaten Gruppen kann man mit einem Prozess nur eine Gruppe voll ausnutzen. Wenn man den Prozess in einer zweiten Instanz startet, muss man manuell die Gruppe ändern, um die zweite NUMA node zu erwischen.
 
Nein leider kein HP.

Das Mainboard ist verbaut: Super Micro dual Sockel 3647 Mainboard

weißt du ob ich es da auch umstellen kann?

Blöd war grad vorher im Büro weil ich einen anderen Server überfordert hab ... schade hätte ich vorher schauen können ;)
 
Die Funktion sollte eigentlich jedes Mainboard haben, aber...…..

Im Grunde genommen umgeht man damit nur Fehler in der Programmierung auf Kosten von Leistung!

Die Funktion ändert nichts am NUMA Aufbau eines Multiprozessorsystems. An jedem Sockel ist nun mal auch der Speicher angebunden und schaltet man die NUMA Unterstützung aus, werden die einzelnen Sockel nicht mehr gruppiert.

Der Sinn von NUMA ist nunmal, dass eine Applikation weiss zu welchen Kernen auch welcher Speicher gehört und gezielt die Komponenten adressieren kann. Wie das geht, habe ich selbst bereits weiter oben verlinkt.

Die Behauptung man könnte mit einem "Prozess" nur eine Gruppe voll ausnutzen ist schwachsinnig. Natürlich kann jede Applikationen Ressourcen aus mehreren Gruppen anfordern, sonst wären alle Multisockelsysteme sinnlos.

Mal anders ausgedrückt. Ich kann auf jeden beliebigen Server ohne irgendwelche Kompatibilitätseinstellungen Prime95 starten und es werden alle Kerne genutzt. Wenn das bei der Applikation nicht der Fall ist, dann stimmt die Programmierung nicht.
https://docs.microsoft.com/en-us/windows/desktop/procthread/numa-support

1532808848133.png


Da der TE aber in seinem System mehr als 64 Kerne hat, werden diese sowieso gruppiert, dass nur nebenbei gesagt.
Support for systems that have more than 64 logical processors is based on the concept of a processor group, which is a static set of up to 64 logical processors that is treated as a single scheduling entity. Processor groups are numbered starting with 0. Systems with fewer than 64 logical processors always have a single group, Group 0.
https://docs.microsoft.com/en-us/windows/desktop/procthread/processor-groups
 
Zuletzt bearbeitet:
Zurück
Oben