Планировщик Linux (не использует все ядра на многоядерной машине) RHEL6

Я вижу странное поведение на одном из моих серверов (работает RHEL 6). Кажется, что-то не так с планировщиком.

Вот тестовая программа, которую я использую:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void RunClient(int i) {
  printf("Starting client %d\n", i);
  while (true) {
  }
}

int main(int argc, char** argv) {
  for (int i = 0; i < 4; ++i) {
    pid_t p_id = fork();
    if (p_id == -1) {
      perror("fork");
    } else if (p_id == 0) {
      RunClient(i);
      exit(0);
    }
  }

  return 0;
}

Эта машина имеет более 4 ядер, поэтому мы ожидаем, что все процессы будут работать на 100%. Когда я проверяю сверху, использование процессора меняется. Иногда это разделение (100%, 33%, 33%, 33%), в других случаях это разделение (100%, 100%, 50%, 50%).

Когда я пробую этот тест на другом нашем сервере (под управлением RHEL 5), проблем не будет (это 100%, 100%, 100%, 100%), как и ожидалось. Что является причиной этого и как я могу это исправить?

Спасибо

2 ответа

Вы, кажется, заново изобретаете колесо, уже существуют различные программы пыток процессора, такие как stress, Бьюсь об заклад, компилятор C оптимизирует вашу программу таким образом, что он не должен постоянно сжигать процессор во время тестового прогона.

Попробуй с

stress -c 4 -t 60

Это запустит 4 процесса, интенсивно использующих процессор, и запустит тест в течение 60 секунд. Могу поспорить, вы увидите четыре ядра, работающие на 100%. Хотя, если у вас НАМНОГО больше ядер, чем 4 (скажем, 16), результат может отличаться, если вы не закрепите команду стресса для использования определенных ядер с taskset,

Что ж, между Red Hat 5 и 6 есть большие различия. Я думаю, что самое большое, что повлияет на ваш вариант использования - это переход на полностью честный планировщик. Он не сломан, но, вероятно, будет демонстрировать другое поведение в верхней части по сравнению с планировщиком в RHEL 5. Это позволит процессам, которые ранее были полностью проигнорированы, получить некоторое время процессора.

Я бы также подумал, что этот пустой цикл while в основном не работает и будет оптимизирован до небытия, если у вас была включена какая-либо оптимизация для компиляции (я не так уж много программист на C, но я считаю, что это так. случай, это может даже произойти без явных флагов оптимизации, поскольку это полностью избыточно). Попробуйте ввести некоторые реальные вычисления и посмотрите, что произойдет.

Как правило, если вы не знаете достаточно, чтобы написать свой собственный планировщик ядра, я бы предположил, что это не ошибка, а проявление того, как работает система. Или проблема с вашим кодом / инструментарием.

Другие вопросы по тегам