Start · Sprachen · PHP · Referenz · pcntl_getcpu

pcntl_getcpu

Funktion

Gibt die CPU-Nummer zurück, auf der der aktuelle Prozess zuletzt ausgeführt wurde.

seit PHP 8.4.0 Kategorie: misc

Signatur

pcntl_getcpu(): int

Beschreibung

pcntl_getcpu() ruft die Nummer des CPU-Kerns ab, auf dem der aktuelle Prozess zuletzt gelaufen ist. Dies entspricht dem Linux-Systemaufruf sched_getcpu(2), der die logische CPU-Nummer (0-basiert) aus dem VDSO oder via getcpu-Syscall ermittelt.

Die Funktion ist besonders nützlich für Diagnose- und Profiling-Zwecke: Mit ihr lässt sich beobachten, ob das Betriebssystem einen Prozess zwischen verschiedenen CPU-Kernen migriert, was zu Cache-Misses und Performance-Einbußen führen kann. In Kombination mit pcntl_setaffinity() kann man CPU-Affinität gezielt steuern und danach mit pcntl_getcpu() verifizieren.

Beachte, dass der zurückgegebene Wert nur eine Momentaufnahme ist: Der Kernel kann den Prozess unmittelbar nach dem Aufruf auf einen anderen Kern verschieben. Die Information eignet sich daher für Monitoring und Logging, nicht für harte Echtzeit-Garantien.

Die Funktion steht nur auf Linux-Systemen zur Verfügung und erfordert die PCNTL-Erweiterung.

Rückgabewert

Typ
int
Beschreibung
Gibt die 0-basierte Nummer des CPU-Kerns zurück, auf dem der Prozess zuletzt ausgeführt wurde. Im Fehlerfall wird -1 zurückgegeben.

Beispiele

Aktuelle CPU-Nummer ausgeben

<?php
// Aktuelle CPU-Nummer des laufenden Prozesses ermitteln
$cpu = pcntl_getcpu();

if ($cpu === -1) {
    echo "Fehler beim Ermitteln der CPU-Nummer." . PHP_EOL;
} else {
    echo "Prozess läuft auf CPU-Kern: " . $cpu . PHP_EOL;
}
Prozess läuft auf CPU-Kern: 3

CPU-Affinität setzen und verifizieren

<?php
// Prozess auf CPU-Kern 0 beschränken
$pid = posix_getpid();

if (pcntl_setaffinity($pid, [0])) {
    echo "Affinität auf Kern 0 gesetzt." . PHP_EOL;

    // Etwas Arbeit simulieren, damit der Scheduler greift
    $sum = 0;
    for ($i = 0; $i < 1_000_000; $i++) {
        $sum += $i;
    }

    $cpu = pcntl_getcpu();
    echo "Prozess lief auf CPU-Kern: " . $cpu . PHP_EOL;
    // Erwartete Ausgabe: 0, da die Affinität auf Kern 0 gesetzt wurde
} else {
    echo "Fehler beim Setzen der CPU-Affinität." . PHP_EOL;
}
Affinität auf Kern 0 gesetzt. Prozess lief auf CPU-Kern: 0

// Wichtig · Fallstricke

Plattformabhängigkeit: pcntl_getcpu() ist ausschließlich auf Linux-Systemen verfügbar und nicht auf macOS oder anderen BSD-Systemen. Bei Verwendung auf nicht unterstützten Plattformen führt der Aufruf zu einem Fehler.

Nicht-deterministisch: Da der Linux-Kernel Prozesse jederzeit zwischen Kernen migrieren kann, ist der zurückgegebene Wert nur eine Momentaufnahme. Eine Garantie, dass der Prozess nach dem Aufruf noch auf demselben Kern läuft, gibt es nicht — außer wenn zusätzlich eine CPU-Affinität mit pcntl_setaffinity() gesetzt wurde.

Verfügbarkeit: Die Funktion wurde in PHP 8.4.0 eingeführt. Für ältere PHP-Versionen gibt es keine direkte Alternative in der PCNTL-Erweiterung; man müsste ggf. auf /proc/self/stat zurückgreifen.