In einer Mehrkern-CPU hängt der CPU-Kern, auf dem der Prozessthread ausgeführt wird, vom Scheduler des Betriebssystems ab, und der Kontext kann je nach Situation auf einen anderen CPU-Kern verschoben werden. Unter Linux können Sie die CPU-Affinität festlegen, um solche Bewegungen zu verhindern, und zulassen, dass Prozessthreads nur auf bestimmten CPU-Kernen ausgeführt werden (hauptsächlich aufgrund von Leistungsproblemen).
Eine Sammlung logischer CPUs, die der Thread ausführen darf. Die CPU-Affinität wird durch eine Bitmaske dargestellt.
Beispielsweise ist CPU0 "0x00000001", CPU1 ist "0x00000002" und der Satz von CPU0,1,3 ist "0x0000000b".
Sie können überprüfen, welcher CPU-Kern CPU0 tatsächlich ist, indem Sie cat / proc / cpuinfo
verwenden.
Sie können die CPU-Affinität eines Prozesses mit dem Befehlstaskensatz festlegen.
# taskset -p mask pid
Geben Sie für Maske die CPU-Affinität und für pid den Prozess an, den Sie ändern möchten.
Verwenden Sie die Option -a
, um für alle Threads in der Prozess-PID zu ändern.
# taskset -a -p mask pid
Nur dieser Prozess darf auf dieser CPU ausgeführt werden, und alle anderen Prozesse werden davon abgehalten.
# ps -e -o pid= | xargs -n 1 taskset -p 0xFFFFFFFE
# taskset -p 0x00000001 PID
Verwenden Sie die Funktion sched_setaffinity (), um die CPU-Affinität programmgesteuert festzulegen.
#define _GNU_SOURCE /* feature_test_Siehe Makros*/
#include <sched.h>
void
func(void)
{
cpu_set_t mask;
int ret;
//Schalten Sie alle Masken aus
CPU_ZERO(&mask);
// CPU_AFFINITY_Erlaube das Laufen auf dem Kern von MASK
CPU_SET(CPU_AFFINITY_MASK, &mask);
//Stellen Sie die CPU-Affinität ein
ret = sched_setaffinity(0, sizeof(mask), &mask);
if (ret != 0) {
// error
}
}
Recommended Posts