cpu_usage

(PHP 8.6+, True Async 1.0)

Async\cpu_usage() 返回自上次调用以来的 CPU 占用,并已经换算为百分比。适合放在遥测循环里。

描述

php
namespace Async;

function cpu_usage(): array

函数在每个进程内维护一份内部的"上次"CPU 计数器快照。首次调用保存快照并返回 0; 之后每次调用返回与上次快照的差值,并替换掉快照。

返回值

关联数组:

类型含义
process_coresfloat进程平均占用的核数(0..cpuCount)。多核系数。
process_percentfloat占总机器容量的百分比,0..100
system_percentfloat宿主机整体 CPU 利用率,0..100
cpu_countintOS 可见的逻辑 CPU 数。
interval_secfloat两次快照之间的 wall-clock 秒数。
loadavgarray{0:float,1:float,2:float}|null1/5/15 分钟 load average;Windows 上为 null

在容器内,system_percent 反映的是宿主机,而不是 cgroup。做 per-process backpressure 时 优先用 process_cores / process_percent —— 它们正确处理 affinity 和 cgroup CPU 限流。

示例

示例 #1 每秒输出负载

php
<?php
use function Async\spawn;
use function Async\delay;
use function Async\cpu_usage;

spawn(function () {
    // 首次调用只是"预热"内部快照,返回零。
    cpu_usage();

    while (true) {
        delay(1000);
        $u = cpu_usage();
        printf(
            "[CPU] proc %.2f cores (%.1f%%), system %.1f%%, interval %.3fs\n",
            $u['process_cores'],
            $u['process_percent'],
            $u['system_percent'],
            $u['interval_sec'],
        );
    }
});

示例 #2 基于进程负载的 backpressure

php
<?php
use function Async\cpu_usage;

function should_accept_more_work(): bool
{
    $u = cpu_usage();
    // 在进程占自身容量 > 90% 时不再接新任务。
    return $u['process_percent'] < 90.0;
}

示例 #3 健康检查端点

php
<?php
use TrueAsync\HttpServer;
use TrueAsync\HttpServerConfig;
use function Async\cpu_usage;
use function Async\loadavg;

$server = new HttpServer((new HttpServerConfig())->addListener('0.0.0.0', 8080));

$server->addHttpHandler(function ($req, $res) {
    if ($req->getPath() === '/healthz') {
        $u = cpu_usage();
        $res->json([
            'cpu' => $u,
            'load' => loadavg(),
        ]);
        return;
    }
    $res->setStatusCode(404);
});

$server->start();

备注

状态是进程级全局的。 如果需要多个独立的遥测消费者(例如不同子系统各算自己的差值), 用 CpuSnapshot::now() 手动取快照,自己算差值。

也可参考