Domanda

Sto cercando di determinare l'utilizzo della CPU dei miei script PHP. Ho appena trovato questo articolo che dettaglia come trovare di sistema e utente tempo di utilizzo della CPU (sezione 4).

Tuttavia, quando ho provato gli esempi, ho ricevuto risultati completamente diversi.

Il primo esempio :

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

Risultati in:

User time: 29.53
System time: 2.71

Esempio 2 :

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

}

// Same echo statements

Risultati:

User time: 16.69
System time: 2.1

Esempio 3 :

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

}  

// Same echo statements

Risultati:

User time: 34.94
System time: 3.14

Ovviamente, nessuna delle informazioni siano corrette , tranne forse l'ora del sistema nel terzo esempio. Così che cosa sto facendo di sbagliato? Mi piacerebbe molto essere in grado di utilizzare queste informazioni, ma ha bisogno di essere affidabile.

sto usando Ubuntu Server 8.04 LTS (32-bit) e questo è l'output di 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
È stato utile?

Soluzione

E 'possibile utilizzare il 'tempo' comando il sistema per verificare queste informazioni dall'esterno:

/usr/bin/time php script.php

che stamperà qualcosa come:

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

Naturalmente, dont't dimenticare che le informazioni getrusage () è tempo di CPU utilizzata e microtime () è parete ora dell'orologio. Il programma può funzionare per 10 minuti secondo l'orologio sul muro, ma internamente può utilizzare solo pochi secondi di tempo di CPU. Poi c'è contendono il tempo di CPU con tutti i programmi in background in esecuzione sul sistema, conflitto di risorse, più pulizia regolare.

C'è troppi fattori coinvolti per essere in grado di ottenere un preciso timing per periodi così brevi. Fare tre piste della versione while(microtime()) del ciclo, ho ottenuto le seguenti tempistiche:

utente: 0.98, 0.09, 0.90 sys: 0.12, 0.05, 0.94

Ovviamente tutto la varianza. Anche solo un semplice <? print_r(getrusage()) ?> ha utime / stimes compresi tra 0 e 0,03.

Provare a eseguire i loop per periodi più lunghi, e fare qualcosa al loro interno per aumentare l'utilizzo della CPU. In questo momento i numeri sono troppo piccoli per misurare con precisione.

Altri suggerimenti

Grazie a di Marc B consiglio , sono stato in grado di capire che i ridicolmente brevi tempi stavano causando errori nei calcoli di getrusage().

ho creato un work-around di scartare questi numeri imprecisi. Ecco il codice:

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

Speriamo che questo sarà utile a chiunque altro vivendo lo stesso problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top