PHP getrusage () Rückkehr falsche Informationen?
-
02-10-2019 - |
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
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.