Конфликт процессора (время ожидания) для процесса в Linux - PullRequest
1 голос
/ 13 июля 2010

Как я могу проверить, сколько процесс тратит на ожидание ЦП в окне Linux?

Например, в загруженной системе я хочу проверить, как долго ожидает процесс SQL * Loader (sqlldr).

Было бы полезно, если для этого есть инструмент командной строки.

Ответы [ 3 ]

1 голос
/ 14 июля 2010

Вот как вы должны измерить это.Имейте число процессов, превышающее число ваших processors * cores * threading capability ожидания (блока) для события, которое разбудит их всех одновременно.Одним из таких событий является многоадресный сетевой пакет.Используйте библиотеку инструментов, такую ​​как PAPI (или еще одну, соответствующую вашим потребностям), чтобы измерить разницу в реальном и виртуальном времени пробуждения между вашими процессами.Из нескольких итераций эксперимента вы можете получить оценку времени конфликта ЦП для ваших процессов.Очевидно, что это не совсем точно для многоядерных процессоров, но, возможно, это поможет вам.

Приветствия.

1 голос
/ 14 июля 2010

У меня была эта проблема некоторое время назад.Я закончил с использованием getrusage: Вы можете получить подробную помощь по адресу: http://www.opengroup.org/onlinepubs/009695399/functions/getrusage.html

getrusage заполняет структуру rusage.


Измерение времени ожидания с помощью getrusage

Вы можете вызвать getrusage в начале вашего кода, а затем снова вызвать его в конце или в какой-то подходящей точкево время исполнения.Затем у вас есть initial_rusage и final_rusage.Время пользователя, потраченное вашим процессом, указывается с помощью rusage-> ru_utime.tv_sec, а системное время, потраченное процессом, указывается с помощью rusage-> ru_stime.tv_sec.

Таким образом, общее пользовательское время, потраченное процессом, будет: user_time = final_rusage.ru_utime.tv_sec - initial_rusage.ru_utime.tv_sec

Общее системное время, потраченное процессом, будет:system_time = final_rusage.ru_stime.tv_sec - initial_rusage.ru_stime.tv_sec

Если total_time - это время, прошедшее между двумя вызовами getrusage, тогда время ожидания будет wait_time = total_time - (user_time + system_time)

Надеюсь, это поможет

1 голос
/ 13 июля 2010

Я быстро ударил это вместе. Он печатает самые маленькие и самые большие "помехи" от переключения задач ...

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

double seconds()
{
    timeval t;
    gettimeofday(&t, NULL);
    return t.tv_sec + t.tv_usec / 1000000.0;
}

int main()
{
    double min = 999999999, max = 0;
    while (true)
    {
        double c = -(seconds() - seconds());
        if (c < min)
        {
            min = c;
            printf("%f\n", c);
            fflush(stdout);
        }
        if (c > max)
        {
            max = c;
            printf("%f\n", c);
            fflush(stdout);
        }
    }

    return 0;
}
...