2015-12-03 6 views
0

Для нашего проекта, написанного на C++, мы запускаем процессорные ядра в режиме опроса для опроса драйвера (dpdk), но в режиме опроса использование процессора показывает 100% в top/htop. Когда мы начали видеть сбой пакетов, вычисляем количество циклов или опросов, выполняемых в секунду на ядре (зависит от скорости и типа процессора).Утилита процессора в режиме опроса

Образец кода, используемый для расчета опросов/секций с использованием и без накладных расходов функции опроса драйвера, приведен ниже.

#include <iostream> 
#include <sys/time.h> 
int main() { 
    unsigned long long counter; 
    struct timeval tv1, tv2; 
    gettimeofday(&tv1, NULL); 
    gettimeofday(&tv2, NULL); 
    while(1) { 
     gettimeofday(&tv2, NULL); 
     //Some function here to measure the overhead 
     //Poll the driver 
     if ((double) (tv2.tv_usec - tv1.tv_usec)/1000000 + (double) (tv2.tv_sec - tv1.tv_sec) > 1.0) { 

      std::cout << std::dec << "Executions per second = " << counter << " per second" << std::endl; 
      counter = 0; 
      gettimeofday(&tv1, NULL); 
     } 
     counter++; 
    } 
} 

Результаты подсчета опроса являются различными, иногда мы видим глюк и число спуститесь на 50% или ниже, чем обычные подсчетов, думали, что это может быть проблема с Linux планирования задачи так Изолированные жилы с помощью Linux командной строки (isolcpus = ...), установить сродство, увеличить приоритет для процесса/потока до наивысшего приятного значения и типа в реальном времени (RT)

Но никакой разницы.

Вопрос: Можем ли мы полагаться на количество циклов/опросов в секунду, выполненных на ядре процессора в режиме опроса?

Есть ли способ рассчитать загрузку процессора в режиме опроса, так как процессорное использование процессора отображается на 100% сверху?

Это правильный подход для решения этой проблемы?

Окружающая среда:

  • Intel (R) Xeon (R) CPU E5-2680 v3 @ 2.50GHz
  • 8G баран
  • Ubuntu на виртуальной машине Vmware гипервизора.

Не уверен, что это было ранее ответило, любые ссылки будут полезны.

+2

Хорошо, почему вы опросили водителя? –

+0

С тарифной ставкой, которую мы хотели поддержать, мы не можем получить с режимом прерывания, поэтому для этой цели для dpdk используется драйвер режима опроса (PMD). Чтобы получить пакеты в пользовательское пространство в обход ядра. – Randolf

+0

Не добавляйте тег C для C++. – Olaf

ответ

3

Нет, вы не можете полагаться на «количество циклов/опросов в секунду, выполненных на ядре процессора в режиме опроса».

Это фундаментальный аспект среды исполнения в традиционной операционной системе, такой как тот, который вы используете: mainstream Linux.

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

Даже если вы используете root, вы не будете полностью контролировать ресурсы своего процесса.

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

Существуют и другие операционные системы реального времени, в которых пользовательские приложения могут иметь определенный «уровень обслуживания», то есть минимальные ресурсы ЦП или ввода-вывода, на которые вы можете положиться, чтобы гарантировать пол по количеству раз, последовательность кода может быть выполнена в секунду или какой-либо другой показатель.

В Linux есть несколько вещей, которые можно поиграть, например, уровень nice процесса и несколько других вещей.Но это все равно не даст вам никаких абсолютных гарантий.

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

Единственный способ гарантировать тип метрики, который вы ищете, - использовать операционную систему реального времени вместо Linux. Несколько лет назад я слышал о расширениях реального времени для ядра Linux (Google food: «linux rtos»), но в последнее время они мало что слышали. Я не считаю, что основные дистрибутивы Linux включают в себя это расширение ядра, поэтому, если вы хотите пойти таким путем, вы будете сами.

+0

Я попытался переключиться на ядро ​​реального времени (RT linux для ubuntu) из ядра с низкой латентностью для этого, но это не имело никакого значения. Я убедился, что в Linux не работает другой процесс, все службы остановлены (в том числе cron), а ядра изолированы и приоритет изменен (с использованием nice и chrt -r 99), но нет разницы. вы правы, мейнстрим не поддерживает RT и его отдельный патч, который будет применяться, и перекомпилируйте ядро ​​с включенной опцией Realtime. – Randolf

+3

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

+0

Я бы тоже утверждал, что такой опрос не имеет смысла на гипервизоре. Имеет смысл только опробовать что-то внешнее, что может произойти спонтанно, но это невозможно в виртуальной среде (если не реализовано в гипервизоре против голого металла). –

0

Современный linux на intel cpu действительно предоставляет способы сделать цикл опроса полностью занятым ядром процессора почти на 100%. вещи, которые вы не рассмотрели, удалите системный вызов, который вызовет переключение контекста, отключит гиперпоточность или не будет использовать другой поток, который находится в одной и той же строке кэша, отключите динамическое повышение частоты процессора в BIOS, переместите обработку прерываний.