Требуется ли время для использования процессора?

У меня есть одноядерная машина x86, где я burnP6 (из пакета cpuburn) в течение 1 секунды, а затем убиваю программу:

 while true; do /usr/bin/burnP6 & sleep 1; pkill burnP6; sleep 1; done 

Если я проверю загрузку процессора с помощью top -d 1 , загрузка для процесса burnP6 обычно составляет менее 50%. Если я запустил while true; do ps -e -o cmd,pcpu | grep burnP6; done while true; do ps -e -o cmd,pcpu | grep burnP6; done while true; do ps -e -o cmd,pcpu | grep burnP6; done команда, загрузка ЦП имеет следующие характеристики:

 /usr/bin/burnP6 0.0 /usr/bin/burnP6 9.0 /usr/bin/burnP6 10.0 /usr/bin/burnP6 10.0 /usr/bin/burnP6 11.0 /usr/bin/burnP6 11.0 /usr/bin/burnP6 12.0 /usr/bin/burnP6 12.0 /usr/bin/burnP6 13.0 /usr/bin/burnP6 14.0 /usr/bin/burnP6 15.0 /usr/bin/burnP6 15.0 /usr/bin/burnP6 16.0 /usr/bin/burnP6 16.0 /usr/bin/burnP6 17.0 /usr/bin/burnP6 18.0 /usr/bin/burnP6 18.0 /usr/bin/burnP6 19.0 /usr/bin/burnP6 20.0 /usr/bin/burnP6 20.0 /usr/bin/burnP6 21.0 /usr/bin/burnP6 22.0 /usr/bin/burnP6 22.0 /usr/bin/burnP6 23.0 /usr/bin/burnP6 24.0 /usr/bin/burnP6 24.0 /usr/bin/burnP6 25.0 /usr/bin/burnP6 25.0 /usr/bin/burnP6 26.0 /usr/bin/burnP6 27.0 /usr/bin/burnP6 28.0 /usr/bin/burnP6 28.0 /usr/bin/burnP6 28.0 /usr/bin/burnP6 30.0 /usr/bin/burnP6 30.0 /usr/bin/burnP6 31.0 /usr/bin/burnP6 31.0 /usr/bin/burnP6 32.0 /usr/bin/burnP6 32.0 /usr/bin/burnP6 33.0 /usr/bin/burnP6 33.0 /usr/bin/burnP6 35.0 /usr/bin/burnP6 35.0 /usr/bin/burnP6 36.0 /usr/bin/burnP6 36.0 /usr/bin/burnP6 37.0 /usr/bin/burnP6 38.0 /usr/bin/burnP6 38.0 /usr/bin/burnP6 39.0 /usr/bin/burnP6 40.0 /usr/bin/burnP6 40.0 /usr/bin/burnP6 41.0 /usr/bin/burnP6 42.0 /usr/bin/burnP6 42.0 /usr/bin/burnP6 43.0 /usr/bin/burnP6 44.0 /usr/bin/burnP6 44.0 /usr/bin/burnP6 45.0 /usr/bin/burnP6 45.0 /usr/bin/burnP6 46.0 /usr/bin/burnP6 46.0 /usr/bin/burnP6 47.0 /usr/bin/burnP6 48.0 /usr/bin/burnP6 48.0 /usr/bin/burnP6 49.0 /usr/bin/burnP6 50.0 /usr/bin/burnP6 50.0 /usr/bin/burnP6 51.0 /usr/bin/burnP6 52.0 /usr/bin/burnP6 52.0 /usr/bin/burnP6 53.0 /usr/bin/burnP6 0.0 

Как видно выше, нагрузка будет быстро переходить от 0% до 53%, но тогда процесс burnP6 будет убит, то есть он будет работать слишком короткое время, чтобы достичь 99% – 100% использования. Являются ли эти результаты результатом метода измерения, и на самом деле процесс burnP6 использует CPU 100% с самой первой микросекунды? 🙂 Или действительно ли процесс занимает от 1 до 2 секунд, чтобы получить все время процессора?

Команда, которую вы используете для отображения загрузки ЦП, работает в замкнутом цикле, поэтому она конкурирует с CPUburn. Если вы хотите наблюдать загрузку процессора, которую CPUburn будет иметь без конкуренции, добавьте что-то вроде sleep 1 в цикле.

В вашем тесте, вначале цикл наблюдателя получает практически весь процессор, а затем прогрессивно burnP6 все больше и больше доли процессора. Это является следствием политики планирования Linux. Ядро Linux имеет сложный планировщик – на самом деле он имеет множество алгоритмов планирования, и вы можете настроить, какие из них использовать во время выполнения. Прочитайте справочную страницу расписания (7) для введения, а также документацию ядра и справочную книгу, если вы хотите вникнуть в более подробную информацию.

Более опытный человек, чем я, мог бы сказать по этому выводу, что планировщик активен в вашей системе. Я не могу. Я вижу, что он имеет привилегии для программ ввода-вывода (цикл ps | grep , который практически ничего не делает, кроме загрузки исполняемых файлов, создания процессов и передачи данных) для высокопроизводительных потребителей. Это имеет смысл во многих ситуациях: программа, интенсивно использующая процессор, вероятно, не прочь потратить 1,1 вместо 1 с на вычисление, тогда как интенсивная программа ввода-вывода часто представляет собой поток пользовательского интерфейса или сетевую услугу, для которой быстрый ответ время (низкая латентность). По-видимому, существует какая-то мера справедливости, которая затем отталкивает баланс от группы процессов, которая забивает весь процессор.

Было бы поучительно играть с настройками в /proc/sys/kernel/sched* и посмотреть, как меняется поведение.