Frage

Ich versuche, die CPU-Auslastung meines PHP-Skripte zu bestimmen. Ich habe gerade dieser Artikel die Details, wie System- und Benutzer-CPU-Nutzungszeit finden (Abschnitt 4).

Allerdings, wenn ich die Beispiele ausprobiert, erhielt ich völlig unterschiedliche Ergebnisse.

Das erstes Beispiel :

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

Ergebnisse in:

User time: 29.53
System time: 2.71

Beispiel 2 :

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

}

// Same echo statements

Ergebnisse:

User time: 16.69
System time: 2.1

Beispiel 3 :

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

}  

// Same echo statements

Ergebnisse:

User time: 34.94
System time: 3.14

Offensichtlich keine der Informationen korrekt außer vielleicht die Systemzeit im dritten Beispiel. Also, was mache ich falsch? Ich möchte wirklich in der Lage sein, diese Informationen zu verwenden, aber es muss zuverlässig sein.

Ich bin mit Ubuntu Server 8.04 LTS (32-Bit), und dies ist die Ausgabe von 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
War es hilfreich?

Lösung

Sie können das System ‚Zeit‘ verwenden Sie den Befehl zur Überprüfung dieser Informationen extern:

/usr/bin/time php script.php

, die wie etwas gedruckt werden:

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

Natürlich dont't vergessen, dass die getrusage () Informationen CPU-Zeit verwendet und Mikrozeit () ist Wanduhr Zeit. Das Programm kann für 10 Minuten nach der Uhr an der Wand laufen, aber intern nur wenige Sekunden CPU-Zeit verwenden. Dann gibt es noch streit für CPU-Zeit mit allen Hintergrundprogrammen auf dem System laufen, Ressourcenkonflikten, sowie regelmäßigen Housekeeping.

Es gibt viel zu viele Faktoren eine Rolle spielen zu können, um einen genauen Zeitpunkt für ein solche kurze Zeiträume erhalten. drei Läufe der while(microtime()) Version Ihrer Schleife zu tun, habe ich die folgenden Timings:

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

Offensichtlich ganz die Varianz. Auch nur eine einfache <? print_r(getrusage()) ?> hat utime / stimes 0-0,03 reichen.

Versuchen Sie Schleifen für einen längeren Zeitraum laufen, und etwas in ihnen CPU-Auslastung zu erhöhen. Gerade jetzt Ihre Zahlen sind zu klein, um genau zu messen.

Andere Tipps

Dank Marc B Rat , konnte ich Figur darauf hin, dass die lächerlich kurze Zeit wurden Fehler in getrusage() Berechnungen verursacht.

ich eine Behelfslösung erstellt haben diese ungenauen Zahlen zu verwerfen. Hier ist der 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 ));
}

Wir hoffen, dass dies jedem hilfreich sein, sonst das gleiche Problem auftritt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top