2009-06-10 5 views
0

Das Perl-Modul Proc :: ProcessTable beobachtet gelegentlich, dass das pctcpu-Attribut 'inf', 'nan' oder ein Wert größer als 100 ist. Warum tut es das? Und gibt es Richtlinien zum Umgang mit dieser Art von Informationen?Im Perl-Modul Proc :: ProccessTable, warum gibt Pctcpu manchmal 'inf', 'nan' oder einen Wert größer als 100 zurück?

Wir haben dies auf verschiedenen Plattformen einschließlich Linux 2.4 auf 8 logischen Prozessoren beobachtet.

Ich würde vermuten, dass 'inf' oder 'nan' das Ergebnis eines unmöglich großen Wertes oder einer Division durch Null ist.

Für Werte größer als 100, konnte dies möglicherweise bedeuten, dass mehr als ein Prozessor verwendet wurde?

Und um mit diesen Informationen umzugehen, ist die beste Vorgehensweise, den Datenpunkt lediglich als nicht vertrauenswürdig und normalisierend auf 100% zu markieren?

Antwort

1

Ich weiß nicht, warum das passiert, und ich kann nicht betonen, testen Sie das Modul gerade jetzt versuchen, solche Fälle zu generieren.

Aber ein Grundsatz, dem ich meine ganze Forschung gefolgt habe, besteht nicht darin, Daten, die ich als Unsinn verstehe, durch etwas zu ersetzen, das vernünftig aussieht. Sie haben grundsätzlich keine Beobachtungen und Sie sollten sie als solche behandeln. Ich würde überhaupt keinen Zahlenwert anhängen, um nicht vorzutäuschen, dass ich Informationen habe, wenn ich es nicht tue.

Dann sind Ihre Statistiken für die nicht fehlenden Punkte sinnvoll und Sie können alle Muster in den fehlenden Beobachtungen separat betrachten.

UPDATE: Mit Blick auf die calc_prec() Funktion im source code:

/* calc_prec() 
* 
* calculate the two cpu/memory precentage values 
*/ 
static void calc_prec(char *format_str, struct procstat *prs, struct obstack *mem_pool) 
{ 
    float pctcpu = 100.0f * (prs->utime/1e6)/(time(NULL) - prs->start_time); 

    /* calculate pctcpu - NOTE: This assumes the cpu time is in microsecond units! */ 
    sprintf(prs->pctcpu, "%3.2f", pctcpu); 
    field_enable(format_str, F_PCTCPU); 

    /* calculate pctmem */ 
    if (system_memory > 0) { 
     sprintf(prs->pctmem, "%3.2f", (float) prs->rss/system_memory * 100.f); 
     field_enable(format_str, F_PCTMEM); 
    } 
} 

Zuerst IMHO, wäre es besser, teilen nur durch 1e4 und nicht durch 100.0f nach der Teilung multipliziert wird. Zweitens ist es möglich (wenn sofort nach dem Prozessabruf abgefragt wird) für das Zeitdelta 0 zu sein. Drittens hätte ich die ganze Sache einfach in double erledigt.

Nebenbei sieht diese Funktion wie ein gutes Beispiel dafür aus, warum Sie keine Kommentare im Code haben sollten.

#include <stdio.h> 
#include <time.h> 

volatile float calc_percent(
     unsigned long utime, 
     time_t now, 
     time_t start 
) { 
    return 100.0f * (utime/1e6)/(now - start); 
} 

int main(void) { 

    printf("%3.2f\n", calc_percent(1e6, time(NULL), time(NULL))); 
    printf("%3.2f\n", calc_percent(0, time(NULL), time(NULL))); 

    return 0; 
} 

Diese Ausgänge inf im ersten Fall und nan im zweiten Fall, wenn sie mit Cygwin gcc-4 auf Windows zusammengestellt. Ich weiß nicht, ob dieses Verhalten Standard ist oder was genau mit dieser speziellen Kombination von OS + Compiler passiert.

Verwandte Themen