Вопрос по linux-kernel, linux, cpu-usage, sleep – Nanosleep высокая загрузка процессора?

5

Я заметил, что небольшая тестовая программа, которая вызывает nanosleep, показывает огромную разницу в загрузке процессора при работе на машинах Linux с ядром, более новым, чем 2.6.22.

#include <time.h>
int main (void)
{
    struct timespec sleepTime;
    struct timespec returnTime;
    sleepTime.tv_sec = 0;
    sleepTime.tv_nsec = 1000;
    while (1)
    {
      nanosleep(&sleepTime, &returnTime);
    }
    return 0;
}

(Да, я понимаю, что эта программа ничего не делает)

Если я скомпилирую это и запущу его на машине openSUSE 10.3 (2.6.22.19-0.2-default), программа даже не отобразится в списке процессов, сгенерированном & quot; top & quot ;, указывая, что он использует очень мало ЦП время. Если я запускаю его на машине openSUSE 11.1 (2.6.27.23-0.1-default), top показывает, что программа занимает 40% процессорного времени. Работа на Fedora 9 (2.6.25-14.fc9.i686) и Fedora 10 также показала такое же высокое использование ЦП в «top».

Произошло ли изменение в ядре, которое влияет на это?

Ваш Ответ

2   ответа
2

на что я бы обратил внимание, это параметры конфигурации, с помощью которых было скомпилировано ядро:

cat /boot/config-`uname -r`

Варианты, которые я думаю, могут иметь отношение кCONFIG_HZ, CONFIG_HPET_TIMER а такжеCONFIG_HIGH_RES_TIMERS, Возможно, они различаются в ваших ядрах ... это может помочь вам сузить кругозор.

Раньше на ядрах 2.4 было, что nanosleep был бы занят - ожидание ожидания менее 2 мс, если он работал в политиках планировщика реального времени (SCHED_FIFO или жеSCHED_RRсмman-страница о нано-сне), но, поскольку все ядра имеют 2.6, это, похоже, не является фактором.

18

Это связано с введением NO_HZ в основной планировщик.

Раньше ваш сон 1000 нс обычно спал целую галочку - 1 000 000 нс. Теперь, когда машина бездействует, она фактически спит только за то, что вы просили. Таким образом, он запускает цикл while () и выполняет системный вызов примерно в 1000 раз чаще, а значит, значительно увеличивает нагрузку на процессор. Если вы увеличите tv_nsec, вы увидите снижение загрузки процессора.

Похожие вопросы