Meine lokalen Rechner haben mehrere CPUs, jeder hat mehrere Kerne und jeder kann mehrere Threads unterstützen. Ich habe einen Multithreading-Prozess, den ich zwingen möchte, nur auf einem einzigen Thread zu laufen. Ich verstehe, dass numactrl
das geht.
Wie kann ich numactl
den Prozess zwingen, nur auf einem einzigen Thread zu laufen? Gibt es alternativ ein noch einfacheres integriertes Dienstprogramm, das dies kann?
Antwort1
numactl --physcpubind=+1 /path/to/your/executable
dadurch sollte Ihr Prozess auf dem zweiten Kern/der zweiten CPU ausgeführt werden, der Ihrem Chipsatz zugewiesen ist (Index 1). Weitere Einzelheiten finden Sie im Abschnitt „Beispiele“ der Manpage: http://linux.die.net/man/8/numactl
Bearbeiten: Ich sollte darauf hinweisen, dass dies bedeutet, dass das Programm höchstens einen Thread gleichzeitig ausführt, aber nicht, dass der gesamte Prozess nur aus einem Thread besteht. Wenn das Programm so geschrieben ist, dass es einen neuen Thread erzeugt, wird es dies tun, aber es wird auf demselben Core/der selben CPU ausgeführt wie der Rest des Prozesses. Ein kleiner Unterschied, aber dennoch potenziell wichtig.
Antwort2
Um das Programm auf einen CPU-Hardwarekern/-thread zu beschränken, kann man auch verwendentaskset 1 prog [args]
PS
Das Programm zur Begrenzung der Anzahl der Prozesse, die ein Programm haben kann (Threads), ist prlimit --nproc=1 prog [args]
. Ich habe versucht, es zu verwenden rsync
und bekam „Fork nicht verfügbar ... Fehler in IPC“ und das Ende – rsync
ist so geschrieben, dass es nicht als ein Thread funktioniert.
strace prlimit --nproc=1 rsync
Das Ausführen strace
hat wie im SO-Link unten beschrieben angezeigt, der Rückgabewert vom clone
Aufruf ist-1 EAGAIN (resource temporary unavailable).
PS Idee übernommen vonhttps://stackoverflow.com/questions/38637451/is-there-a-way-force-a-program-to-use-only-1-thread.