2015-06-08 2 views
2

В настоящее время я пишу приложение в C, в котором я намерен имитировать загрузку процессора в ubuntu менее 100%. Я использовал алгоритм факториалов, чтобы подчеркнуть мой CPU и функцию nanosleep для регулирования использования ЦП. Цель состоит в том, чтобы иметь постоянное использование ЦП с разумным допуском, который может варьироваться поэтапно, т. Е. 20%, 30% и т. Д. Проблема заключается в том, что когда я запускаю свое приложение, я получаю отсканированную нагрузку 45-53%, где я хочу иметь нагрузку 50% использования процессора. Из-за моих исследований мне нужно получить стабильное использование ЦП, когда я вычисляю время отклика, отслеживая отметку времени между двумя исполнениями.Нестабильное использование ЦП

EDIT Я использую рабочую станцию ​​VmWare с Ubuntu 14.04 VM для своих исследований. Вот код

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

int main(void) 
{ 
    struct timeval t1; 

    int milisec = 5; // length of time to sleep, in miliseconds 
    struct timespec req = {0}; 
    req.tv_sec = 0; 
    req.tv_nsec = milisec * 1000000L; 

    FILE *file; 
    file = fopen("trace.txt", "w"); 
    //int j = 0; 
    while(1) 
    { 
     gettimeofday(&t1, NULL);   
     int i; 
     int res = 1; 
     for(i = 0; i < 580000; i++) 
     { 
      res = res*i;  
     } 



     nanosleep(&req, (struct timespec *)NULL); 


     fprintf(file, "%llu%llu\n", (unsigned long long)t1.tv_sec, (unsigned long long)t1.tv_usec); 
     fflush(file); 
     //j++; 
    } 
} 
+0

Ммм, это не '' C++, вам лучше изменить тег 'C'. – kebs

+0

'которые могут варьироваться поэтапно, т. Е. 20%, 30% и т. Д.: Как это должно произойти? Вы не получаете никаких аргументов командной строки. – kebs

+1

И ваш цикл до 580000, вероятно, будет оптимизирован компилятором, если вы не добавите коммутатор, говоря ему, чтобы он этого не делал. Какой компилятор? – kebs

ответ

2

Вот мой взгляд на него - кажется, довольно хорошо в моем тестировании света. Основная идея заключается в использовании getrusage для отслеживания того, сколько времени у процессора было у процессора, разделить это время по истекшему времени, и получить доход, если он превышает целевое отношение. Вы можете увидеть, дает ли он более стабильные результаты, чем ваш собственный код.

(Примечание: вопрос был помечен C++, а не C изначально ... код может тривиальный быть портирован на C)

#include <iostream> 
#include <sstream> 
#include <sys/time.h> 
#include <sys/resource.h> 

void usage_exit(const char* argv0) 
{ 
    std::cerr << "usage " << argv0 << " <target>\n" 
     " spin burning <target> proportion of one CPU (e.g. 0.5 = 50%)\n"; 
    exit(1); 
} 

int main(int argc, const char* argv[]) 
{ 
    if (argc != 2) 
     usage_exit(argv[0]); 
    std::istringstream iss(argv[1]); 
    double target; 
    if (!(iss >> target)) 
     usage_exit(argv[0]); 

    struct timeval start, now; 
    gettimeofday(&start, 0); 

    struct rusage usage; 
    while (getrusage(RUSAGE_SELF, &usage) == 0) 
    { 
     gettimeofday(&now, 0); 
     double running = usage.ru_utime.tv_sec + usage.ru_utime.tv_usec * 1E-6 + 
         usage.ru_stime.tv_sec + usage.ru_stime.tv_usec * 1E-6; 
     double elapsed = now.tv_sec - start.tv_sec + 
         now.tv_usec * 1E-6 - start.tv_usec * 1E-6; 
     if (running/elapsed > target) 
      pthread_yield(); 
    } 
} 
+0

Я не уверен, как запустить код. Когда я ввожу './{filename} 0.5', я получаю 100% -ное использование процессора. То же самое получается с любым другим значением – j4l3

+0

@ j4l3 hmmm ... Я думаю, это потому, что в вашем ящике нет ничего конкурирующего за процессор, поэтому ядро ​​просто запускает эту программу. Мое предположение заключалось в том, что вы хотели, чтобы эта программа использовала любую долю времени процессора, поэтому какая-то другая программа была бы ограничена тем, что все оставалось, - но ваше исследование заключается в том, что эта программа может взламывать процессор сама по себе? Возможно, для наблюдения за последствиями для работы от батареи или тепла? Если это так, использование некоторого наноселективного значения вместо урожайности имеет смысл; сложная вещь настраивает продолжительность: я думаю, что это может быть важно - возможно, проб и ошибок? –

+0

В моем исследовании я тестирую несколько виртуальных машин в рабочей среде VmWare. Я наблюдаю за похищенным временем процессора между двумя или более виртуальными машинами. Вначале я хочу проверить его на одной виртуальной машине. Я хочу запустить одно приложение с определенным фиксированным использованием ЦП, а затем запустить другой, который начинается с 10%, а затем через некоторое время увеличивается до 20%, 30% и т. Д. До 100% – j4l3

Смежные вопросы