Почему в модуле Perl Proc :: ProccessTable иногда pctcpu возвращает 'inf', 'nan' или значение больше 100? - PullRequest
0 голосов
/ 10 июня 2009

Модуль Perl Proc :: ProcessTable иногда замечает, что атрибут pctcpu имеет значение «inf», «nan» или значение больше 100. Почему он это делает? И есть ли какие-либо рекомендации относительно того, как обращаться с такой информацией?

Мы наблюдали это на разных платформах, включая Linux 2.4 на 8 логических процессорах.

Я бы предположил, что 'inf' или 'nan' - это результат некоторого невероятно большого значения или деления на ноль.

Для значений, превышающих 100, может ли это означать, что использовалось более одного процессора?

И что касается работы с этой информацией, является ли наилучшей практикой простая маркировка точки данных как ненадежной и нормализация до 100%?

1 Ответ

1 голос
/ 10 июня 2009

Я не знаю, почему это происходит, и сейчас я не могу провести стресс-тестирование модуля, пытаясь сгенерировать такие случаи.

Однако принцип, которому я следовал во всех своих исследованиях, заключается не в том, чтобы заменить данные, которые, как я знаю, не имеют смысла, чем-то, что выглядит разумным. У вас в основном отсутствуют наблюдения, и вы должны относиться к ним как к таковым. Я бы вообще не прикрепил числовое значение, чтобы не притворяться, что у меня есть информация, а на самом деле у меня ее нет.

Тогда ваша статистика по непропущенным точкам будет иметь смысл, и вы сможете посмотреть на любые закономерности в пропущенных наблюдениях отдельно.

ОБНОВЛЕНИЕ: Просмотр функции calc_prec() в исходном коде :

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

Во-первых, ИМХО, было бы лучше просто разделить на 1e4, а не умножать на 100.0f после деления. Во-вторых, возможно (если опросить сразу после запуска процесса), чтобы дельта времени была 0. В-третьих, я бы просто сделал все это в double.

Кроме того, эта функция выглядит как хороший пример того, почему у вас не должно быть комментариев в коде.

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

Это выводит inf в первом случае и nan во втором случае при компиляции с Cygwin gcc-4 в Windows. Я не знаю, является ли это поведение стандартным или только то, что происходит с этой конкретной комбинацией OS + компилятор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...