Question

Je suis en train de déterminer l'utilisation du processeur de mes scripts PHP. Je viens de découvrir cet article qui explique comment le système trouver et le temps d'utilisation du processeur utilisateur (section 4).

Cependant, quand j'ai essayé les exemples, j'ai reçu des résultats complètement différents.

Le premier exemple :

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

Résultats dans:

User time: 29.53
System time: 2.71

Exemple 2 :

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

}

// Same echo statements

Résultats:

User time: 16.69
System time: 2.1

Exemple 3 :

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

}  

// Same echo statements

Résultats:

User time: 34.94
System time: 3.14

De toute évidence, aucune des informations est correcte sauf peut-être l'heure du système dans le troisième exemple. Alors qu'est-ce que je fais mal? Je voudrais vraiment être en mesure d'utiliser ces informations, mais il doit être fiable.

J'utilise Ubuntu Server 8.04 LTS (32 bits), ce qui est la sortie 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
Était-ce utile?

La solution

Vous pouvez utiliser le système de commande « temps » pour vérifier ces informations à l'extérieur:

/usr/bin/time php script.php

qui imprimera quelque chose comme:

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

Bien sûr, Dont't oublier que le getrusage () l'information est temps CPU utilisé et microtime () est le temps d'horloge murale. Le programme peut fonctionner pendant 10 minutes selon l'horloge sur le mur, mais peut utiliser en interne que quelques secondes de temps CPU. Ensuite, il y a disputant le temps CPU avec tous les programmes d'arrière-plan en cours d'exécution sur le système, les conflits de ressources, ainsi que le ménage régulier.

Il y a beaucoup trop de facteurs impliqués pour être en mesure d'obtenir un calendrier précis pour ces courtes périodes. Faire trois séries de la version while(microtime()) de la boucle, je suis les timings suivants:

utilisateur: 0,98, 0,09, 0,90 sys: 0,12, 0,05, 0,94

De toute évidence tout à fait la variance. Même un simple <? print_r(getrusage()) ?> a utime / Stimes allant de 0 à 0,03.

Essayez d'exécuter vos boucles pour des périodes plus longues, et faire quelque chose en eux pour augmenter l'utilisation du cpu. En ce moment, vos chiffres sont trop petits pour mesurer avec précision.

Autres conseils

Merci à conseils de Marc B , j'ai pu figure que les temps ridiculement court étaient à l'origine des erreurs dans les calculs de getrusage().

J'ai créé un travail autour de jeter ces chiffres inexacts. Voici le code:

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

Il faut espérer que ce sera utile à tous ceux qui connaissent bien le même problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top