Pregunta

Estoy tratando de determinar el uso de la CPU de mis scripts PHP. Acabo de encontrar este artículo que detalla cómo encontrar el sistema y el usuario el tiempo de uso de la CPU (Sección 4).

Sin embargo, cuando probé los ejemplos, he recibido resultados completamente diferentes.

La primer ejemplo :

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);

Los resultados en:

User time: 29.53
System time: 2.71

Ejemplo 2 :

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

}

// Same echo statements

Resultados:

User time: 16.69
System time: 2.1

Ejemplo 3 :

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

}  

// Same echo statements

Resultados:

User time: 34.94
System time: 3.14

Obviamente, ninguna de la información es correcta excepto tal vez la hora del sistema en el tercer ejemplo. Entonces, ¿qué estoy haciendo mal? Me gustaría mucho poder utilizar esta información, pero que tiene que ser fiable.

Estoy usando Ubuntu Server 8.04 LTS (32 bits) y esta es la salida de 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
¿Fue útil?

Solución

Puede utilizar el sistema de 'tiempo' comando para verificar esta información externa:

/usr/bin/time php script.php

que imprimirá algo como:

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

Por supuesto, 't No hay que olvidar que la información getrusage () es el tiempo de CPU utilizado y microtime () es una hora del reloj. El programa puede funcionar durante 10 minutos según el reloj de la pared, pero internamente sólo podrá utilizar unos segundos de tiempo de CPU. Luego está contendiendo por tiempo de CPU con todos los programas en segundo plano que se ejecutan en el sistema, la contención de recursos, además de la limpieza regular.

Hay demasiados factores que intervienen para ser capaz de obtener una precisión de reloj por períodos tan cortos. Haciendo tres carreras de la versión while(microtime()) de su bucle, tengo los siguientes tiempos:

usuario: 0.98, 0.09, 0.90 sys: 0,12, 0,05, 0,94

Obviamente bastante la varianza. Aunque sólo sea un simple tiene <? print_r(getrusage()) ?> utime / stimes van de 0 a 0,03.

Trate de ejecutar sus bucles por períodos más largos, y hacer algo dentro de ellos para aumentar el uso de la CPU. En este momento sus números son demasiado pequeños para medir con precisión.

Otros consejos

Gracias a de Marc B consejos , yo era capaz de figura que los tiempos ridículamente cortos estaban causando errores en los cálculos de getrusage().

He creado un trabajo en torno a descartar estos números inexactos. Aquí está el código:

define('SCRIPT_START', microtime(1));

register_shutdown_function('record_activity');

/* Do work here */

function record_activity()
{
    $data = getrusage();
    $cpuu = ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000);
    $cpus = ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000);
    $renderedtime = round(microtime(1) - SCRIPT_START, 6);

    // Have some log function to put this info somewhere
    insert_record($renderedtime,
        //Only pass user CPU time if it's less than or equal to rendered time
        ($renderedtime >= $cpuu ? $cpuu : NULL ),
        //Only pass system CPU time if it's less than or equal to rendered time
        ($renderedtime >= $cpus ? $cpus : NULL ));
}

Con suerte, esto será útil para cualquier persona que experimenta el mismo problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top