Async\CpuSnapshot
(PHP 8.6+, True Async 1.0)
Async\CpuSnapshot — immutabler Point-in-Time-Snapshot der CPU-Zähler von Prozess und System.
Wann verwenden
Der High-Level-Wrapper Async\cpu_usage() hält einen internen Snapshot pro Prozess und berechnet das Delta automatisch. Das genügt für die meisten Telemetrie-Aufgaben.
CpuSnapshot brauchen Sie, wenn:
- mehrere unabhängige Telemetrie-Konsumenten ihr eigenes Delta zählen sollen;
- die "rohen" Zähler erhalten bleiben müssen (für Log, Dump, Übergabe an ein anderes System);
- nicht nur Process/System, sondern eigene abgeleitete Metriken berechnet werden sollen.
Klassenüberblick
namespace Async;
final class CpuSnapshot
{
public readonly int $wallNs;
public readonly int $processUserNs;
public readonly int $processSystemNs;
public readonly int $systemIdleNs;
public readonly int $systemBusyNs;
public readonly int $cpuCount;
public static function now(): CpuSnapshot;
}Alle Zeit-Felder sind monoton wachsende Nanosekunden-Zähler mit implementation-defined Startpunkt. Ein einzelner Wert ist bedeutungslos — bilden Sie das Delta zwischen zwei Snapshots aus unterschiedlichen Zeitpunkten.
Plattformübergreifend: gleiche Felder und Semantik auf Linux und Windows.
Felder
| Feld | Typ | Beschreibung |
|---|---|---|
wallNs | int | Monotone Wall-Clock-Zeit im Moment der Aufnahme. |
processUserNs | int | Summierte User-Mode-CPU-Zeit aller Threads des Prozesses. |
processSystemNs | int | Summierte Kernel-Mode-CPU-Zeit aller Threads des Prozesses. |
systemIdleNs | int | Summierte Idle-Zeit über alle logischen CPUs des Hosts. |
systemBusyNs | int | Summierte Non-Idle-Zeit über alle logischen CPUs des Hosts (user + system + nice + irq + softirq + steal). |
cpuCount | int | Anzahl der logischen CPUs, die das OS im Moment der Aufnahme sieht. |
In Containern spiegeln
systemIdleNs/systemBusyNsden Host wider, nicht die cgroup. Für Per-Process-Backpressure bevorzugen Sie dieprocess*-Felder — sie berücksichtigen Affinity und cgroup-CPU-Throttling automatisch.
Methoden
now (static)
public static CpuSnapshot::now(): CpuSnapshotErstellt einen frischen Snapshot.
Beispiele
Beispiel #1 Manuelle Delta-Berechnung
<?php
use Async\CpuSnapshot;
use function Async\spawn;
use function Async\delay;
spawn(function () {
$prev = CpuSnapshot::now();
delay(1000);
$now = CpuSnapshot::now();
$wall = $now->wallNs - $prev->wallNs;
$user = $now->processUserNs - $prev->processUserNs;
$sys = $now->processSystemNs - $prev->processSystemNs;
// Wie viele Kerne user + kernel time im Intervall belegt haben.
$processCores = ($user + $sys) / $wall;
printf(
"Prozess belegte im Schnitt %.3f Kerne in der letzten Sekunde\n",
$processCores
);
});Beispiel #2 Zwei unabhängige Konsumenten
<?php
use Async\CpuSnapshot;
class TelemetryReporter
{
private ?CpuSnapshot $prev = null;
public function tick(): array
{
$now = CpuSnapshot::now();
if ($this->prev === null) {
$this->prev = $now;
return ['process_cores' => 0.0];
}
$wall = $now->wallNs - $this->prev->wallNs;
$cpu = ($now->processUserNs - $this->prev->processUserNs)
+ ($now->processSystemNs - $this->prev->processSystemNs);
$this->prev = $now;
return ['process_cores' => $wall > 0 ? $cpu / $wall : 0.0];
}
}
// Zwei Instanzen — zwei unabhängige Messreihen.
$apiMetrics = new TelemetryReporter();
$workerMetrics = new TelemetryReporter();Hinweise
Die Klasse ist immutabel und nicht serialisierbar (
@strict-properties,@not-serializable). Der Konstruktor ist privat — eine Instanz entsteht nur überCpuSnapshot::now().
Siehe auch
- Async\cpu_usage() — fertiges Delta mit bereits berechneten Prozentwerten
- Async\loadavg() — Load Average 1/5/15 min
- Async\available_parallelism() — Anzahl verfügbarer CPUs