Для нашего проекта, написанного на 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=... ), Установите сходство, Увеличьте приоритет процесса/потока до наивысшего значения nice и тип в режиме реального времени (RT)
Но никакой разницы.
Итак, вопросы: можем ли мы полагаться на количество циклов/опросов в секунду, выполняемых ядром процессора в режиме опроса?
Есть ли способ рассчитать загрузку ЦП в режиме опроса, поскольку загрузка ЦП ядер отображается как 100% сверху?
Это правильный подход к этой проблеме?
Окружающая обстановка:
- Процессор Intel(R) Xeon(R) E5-2680 v3 @ 2,50 ГГц
- 8G оперативной памяти
- Виртуальная машина Ubuntu на гипервизоре Vmware.
Не уверен, что на это ранее был дан ответ, любые ссылки будут полезны.