为此,我们将利用该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。