PHP – CPU使用情况信息

为此,我们将利用该getrusage()功能。请记住,这在Windows平台上不可用。

print_r(getrusage());
/* prints
Array
(
[ru_oublock] => 0
[ru_inblock] => 0
[ru_msgsnd] => 2
[ru_msgrcv] => 3
[ru_maxrss] => 12692
[ru_ixrss] => 764
[ru_idrss] => 3864
[ru_minflt] => 94
[ru_majflt] => 0
[ru_nsignals] => 1
[ru_nvcsw] => 67
[ru_nivcsw] => 4
[ru_nswap] => 0
[ru_utime.tv_usec] => 0
[ru_utime.tv_sec] => 0
[ru_stime.tv_usec] => 6269
[ru_stime.tv_sec] => 0
)

*/

除非您已经具有系统管理背景,否则这可能看起来有点神秘。这是每个值的说明(您无需记住这些值):

ru_oublock:块输出操作
ru_inblock:块输入操作
ru_msgsnd:消息发送
ru_msgrcv:消息接收
ru_maxrss:最大驻留集大小
ru_ixrss:积分共享内存大小
ru_idrss:积分非共享数据大小
ru_minflt:页回收率
ru_majflt:页面故障
ru_nsignals:信号接收
ru_nvcsw:自愿上下文切换
ru_nivcsw:不自主上下文切换
ru_nswap:互换
ru_utime.tv_usec:使用的用户时间(微秒)
ru_utime.tv_sec:用户使用时间(秒)
ru_stime.tv_usec:使用系统时间(微秒)
ru_stime.tv_sec:使用系统时间(秒)

要查看脚本消耗了多少CPU能力,我们需要查看“用户时间”和“系统时间”值。默认情况下,分别提供秒和微秒部分。您可以将微秒值除以一百万,然后将其与秒值相加,以得到十进制数形式的总秒数。

让我们来看一个例子:

// 睡眠3秒钟(不忙)
sleep(3);

$data = getrusage();
echo "用户时间: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "系统时间: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);

/* prints
用户时间: 0.011552
系统时间: 0
*/

即使脚本花费了大约3秒钟来运行,但CPU使用率仍然非常低。因为在睡眠操作期间,该脚本实际上不消耗CPU资源。还有许多其他任务可能需要实时执行,但可能不使用CPU时间,例如等待磁盘操作。因此,如您所见,CPU使用率和运行时的实际长度并不总是相同的。

这是另一个示例:

// 循环一千万次(忙)
for($i=0;$i<10000000;$i++) {

}

$data = getrusage();
echo "用户时间: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "系统时间: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);

/* prints
用户时间: 1.424592
系统时间: 0.004204
*/

因为没有系统调用,所以这花费了大约1.4秒的CPU时间,几乎所有时间都是用户时间。

系统时间是CPU代表程序执行内核的系统调用所花费的时间。这是一个例子:

$start = microtime(true);
// 持续拨打microtime约3秒钟
while(microtime(true) - $start < 3) {

}

$data = getrusage();
echo "用户时间: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "系统时间: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);

/* prints
用户时间: 1.088171
系统时间: 1.675315
*/

现在,我们有相当多的系统时间使用情况。这是因为脚本microtime()多次调用该函数,该函数通过操作系统执行请求以获取时间。

另外,您可能会注意到这些数字加起来还不到3秒。这是因为服务器上可能还存在其他进程,并且脚本在3秒钟的整个时间内未使用100%CPU。

为此,我们将利用该getrusage()功能。请记住,这在Windows平台上不可用。

print_r(getrusage());
/* prints
Array
(
[ru_oublock] => 0
[ru_inblock] => 0
[ru_msgsnd] => 2
[ru_msgrcv] => 3
[ru_maxrss] => 12692
[ru_ixrss] => 764
[ru_idrss] => 3864
[ru_minflt] => 94
[ru_majflt] => 0
[ru_nsignals] => 1
[ru_nvcsw] => 67
[ru_nivcsw] => 4
[ru_nswap] => 0
[ru_utime.tv_usec] => 0
[ru_utime.tv_sec] => 0
[ru_stime.tv_usec] => 6269
[ru_stime.tv_sec] => 0
)

*/

除非您已经具有系统管理背景,否则这可能看起来有点神秘。这是每个值的说明(您无需记住这些值):

ru_oublock:块输出操作
ru_inblock:块输入操作
ru_msgsnd:消息发送
ru_msgrcv:消息接收
ru_maxrss:最大驻留集大小
ru_ixrss:积分共享内存大小
ru_idrss:积分非共享数据大小
ru_minflt:页回收率
ru_majflt:页面故障
ru_nsignals:信号接收
ru_nvcsw:自愿上下文切换
ru_nivcsw:非自愿上下文切换ru_nswap:
交换
ru_utime.tv_usec:使用的用户时间(微秒)
ru_utime.tv_sec:使用的用户时间(秒)
ru_stime.tv_usec:使用的系统时间(微秒)
ru_stime.tv_sec:系统)

要查看脚本消耗了多少CPU能力,我们需要查看“用户时间”和“系统时间”值。默认情况下,分别提供秒和微秒部分。您可以将微秒值除以一百万,然后将其与秒值相加,以得到十进制数形式的总秒数。

让我们来看一个例子:

// 睡眠3秒钟(不忙)
sleep(3);

$data = getrusage();
echo "用户时间: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "系统时间: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);

/* prints
用户时间: 0.011552
系统时间: 0
*/

即使脚本花费了大约3秒钟来运行,但CPU使用率仍然非常低。因为在睡眠操作期间,该脚本实际上不消耗CPU资源。还有许多其他任务可能需要实时执行,但可能不使用CPU时间,例如等待磁盘操作。因此,如您所见,CPU使用率和运行时的实际长度并不总是相同的。

这是另一个示例:

// 循环一千万次(忙)
for($i=0;$i<10000000;$i++) {

}

$data = getrusage();
echo "用户时间: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "系统时间: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);

/* prints
用户时间: 1.424592
系统时间: 0.004204
*/

因为没有系统调用,所以这花费了大约1.4秒的CPU时间,几乎所有时间都是用户时间。

系统时间是CPU代表程序执行内核的系统调用所花费的时间。这是一个例子:

$start = microtime(true);
// 持续拨打microtime约3秒钟
while(microtime(true) - $start < 3) {

}

$data = getrusage();
echo "用户时间: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "系统时间: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);

/* prints
用户时间: 1.088171
系统时间: 1.675315
*/

现在,我们有相当多的系统时间使用情况。这是因为脚本microtime()多次调用该函数,该函数通过操作系统执行请求以获取时间。

另外,您可能会注意到这些数字加起来还不到3秒。这是因为服务器上可能还存在其他进程,并且脚本在3秒钟的整个时间内未使用100%CPU。