PHP getrusage() 返回不正确的信息?

标签 php cpu cpu-usage ubuntu-8.04

我正在尝试确定我的 PHP 脚本的 CPU 使用率。我刚找到 this article其中详细介绍了如何查找系统和用户 CPU 使用时间(第 4 节)。

但是,当我尝试这些示例时,我得到了完全不同的结果。

第一个例子:

sleep(3);

$data = getrusage();
echo "User time: ".
    ($data['ru_utime.tv_sec'] +
    $data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
    ($data['ru_stime.tv_sec'] +
    $data['ru_stime.tv_usec'] / 1000000);

结果:

User time: 29.53
System time: 2.71

示例 2:

for($i=0;$i<10000000;$i++) {

}

// Same echo statements

结果:

User time: 16.69
System time: 2.1

示例 3:

$start = microtime(true);  
while(microtime(true) - $start < 3) {  

}  

// Same echo statements

结果:

User time: 34.94
System time: 3.14

很明显,除了第三个示例中的系统时间之外,没有任何信息是正确的。那我做错了什么?我真的很想能够使用这些信息,但它需要可靠。

我使用的是 Ubuntu Server 8.04 LTS(32 位),这是 php -v 的输出:

PHP 5.2.4-2ubuntu5.10 with Suhosin-Patch 0.9.6.2 (cli) (built: Jan  6 2010 22:01:14)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

最佳答案

您可以使用系统'time'命令从外部验证此信息:

/usr/bin/time php script.php

它会打印出如下内容:

0.03user 0.00system 0:03.04elapsed 0%CPU (0avgtext+0avgdata 32752maxresident)k
0inputs+0outputs (0major+2234minor)pagefaults 0swaps

当然,不要忘记 getrusage() 信息是使用的 CPU 时间,而 microtime() 是挂钟时间。根据墙上的时钟,程序可能会运行 10 分钟,但在内部可能只使用几秒钟的 CPU 时间。然后是与系统上运行的所有后台程序争夺 CPU 时间、资源争用以及定期的内务处理。

涉及的因素太多,无法在如此短的时间内获得准确的时间。运行三遍 while(microtime())你的循环版本,我得到了以下时间:

用户:0.98、0.09、0.90 系统:0.12、0.05、0.94

显然差异很大。即使只是一个简单的 <? print_r(getrusage()) ?> utime/stimes 的范围从 0 到 0.03。

尝试长时间运行循环,并在循环中做一些事情来增加 CPU 使用率。现在您的数字太小,无法准确测量。

关于PHP getrusage() 返回不正确的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2732024/

相关文章:

java - 100% CPU 利用率需要帮助分析线程转储

java - 当CPU非常繁忙时,我的多线程java程序出现意外异常

javac 在 CPU 利用率上变得疯狂 ECJ 能够为多线程生产者-消费者维持可预测的 CPU 利用率

php - 从 PHP 运行 node.js 脚本时无法访问文件

PHP遍历DOM并获取属性和文本

PHP 如果 URL 不唯一,则从数组中删除 URL

php - 如何使用 codeigniter 防止 sql 注入(inject)

cpu - 如何减少 Circle CI 或 Travis CI 上的 Elm 编译时间?

c++ - 如何从进程内部确定 CPU 和内存消耗

android - 如何以编程方式获取android cpu温度