12、PHP 原生魅力 - 系统功能 - 获取资源使用情况

作者: 温新

图书: 【原生 PHP 魅力】

阅读: 217

时间: 2024-11-20 01:16:10

getrusage()函数返回调用进程的资源使用统计信息,这是进程中所有线程所使用的资源总和。参数 $mode 是可选的。如果你不带参数地调用 getrusage(),它将返回调用进程的资源使用统计信息。如果你以 1 作为参数调用它,即 getrusage(1),或等效于 (RUSAGE_CHILDREN),它将返回调用进程的所有已终止并被等待的子进程的资源使用统计信息。

它返回一个带有 "resource name" => "value" 的关联数组,这些资源信息如下:

  • ru_utime: 用户 CPU 时间,这是在用户模式下执行所花费的总时间,以 timeval 结构表示,包含 tv_sec(秒)和 tv_usec (微秒);
  • ru_stime: 系统 CPU 时间,这是在内核模式下执行所花费的总时间,同样以 timeval 结构表示,包含 tv_sec(秒)和 tv_usec(微秒);
  • ru_maxrss: 最大常驻集大小,使用的最大常驻集大小(以千字节为单位),当 $mode=1 时,指的是最大子进程的常驻集大小;
  • ru_minflt: 页面回收(软页面错误),无需任何 I/O 活动即得到服务的页面错误次数;
  • ru_majflt: 页面错误(硬页面错误),需要 I/O 活动才能得到服务的页面错误次数;
  • ru_inblock: 块输入操作,文件系统执行输入操作的次数;
  • ru_oublock: 块输出操作,文件系统执行输出操作的次数;
  • ru_nvcsw: 自愿上下文切换,由于进程在时间片完成前自愿放弃处理器(通常是为了等待资源可用)而导致上下文切换的次数;
  • ru_nivcsw: 非自愿上下文切换,由于优先级更高的进程变为可运行状态或当前进程超出了其时间片而导致上下文切换的次数。

获取资源使用情况

<?php

$resources = getrusage();

foreach ($resources as $key => $value) {
    echo "=> " . $key . ": " . $value . PHP_EOL;
}

输出如下:

$ php 12-getrusage.php
=> ru_oublock: 0
=> ru_inblock: 0
=> ru_msgsnd: 0
=> ru_msgrcv: 0
=> ru_maxrss: 27232
=> ru_ixrss: 0
=> ru_idrss: 0
=> ru_minflt: 2229
=> ru_majflt: 1
=> ru_nsignals: 0
=> ru_nvcsw: 0
=> ru_nivcsw: 16
=> ru_nswap: 0
=> ru_utime.tv_usec: 19521
=> ru_utime.tv_sec: 0
=> ru_stime.tv_usec: 0
=> ru_stime.tv_sec: 0

使用参数

如果以 1 作为输入参数调用 getrusage(),它将显示子进程的资源使用情况。如果调用 getrusage(1) 并且该进程没有任何子进程,那么所有值都将为 0。

<?php

$resources = getrusage(1);

foreach ($resources as $key => $value) {
    echo "=> " . $key . ": " . $value . PHP_EOL;
}

输出如下:

$ php 12-getrusage.php
=> ru_oublock: 0
=> ru_inblock: 0
=> ru_msgsnd: 0
=> ru_msgrcv: 0
=> ru_maxrss: 0
=> ru_ixrss: 0
=> ru_idrss: 0
=> ru_minflt: 0
=> ru_majflt: 0
=> ru_nsignals: 0
=> ru_nvcsw: 0
=> ru_nivcsw: 0
=> ru_nswap: 0
=> ru_utime.tv_usec: 0
=> ru_utime.tv_sec: 0
=> ru_stime.tv_usec: 0
=> ru_stime.tv_sec: 0

如果在启动一个进程后调用 getrusage(1),将看到子进程所使用的资源。在示例 exec('sleep 1') 中,它模拟了进程的创建来演示这一情况。

<?php

exec('sleep 1');
$resources = getrusage(1);

foreach ($resources as $key => $value) {
    echo "=> " . $key . ": " . $value . PHP_EOL;
}

输出如下:

$ php 12-getrusage.php
=> ru_oublock: 0
=> ru_inblock: 0
=> ru_msgsnd: 0
=> ru_msgrcv: 0
=> ru_maxrss: 7272
=> ru_ixrss: 0
=> ru_idrss: 0
=> ru_minflt: 161
=> ru_majflt: 0
=> ru_nsignals: 0
=> ru_nvcsw: 4
=> ru_nivcsw: 3
=> ru_nswap: 0
=> ru_utime.tv_usec: 651
=> ru_utime.tv_sec: 0
=> ru_stime.tv_usec: 1382
=> ru_stime.tv_sec: 0
请登录后再评论