«htop» не показывает правильный% процессора, но «top» показывает

12

Во время работы mencoderс потоками = 4 (на четырехъядерном процессоре). Я заметил, что htopне показывает его истинное использование процессора, но показывает top.

Похоже, что htop сообщает только об одном ядре . Это ошибка / ограничение htop ? Что здесь происходит?

Для mencoder нет других записей, отображаемых в psили htopили top. Я предполагаю, что 100% означает, что 1 ядро ​​исчерпано, но даже это кажется мне странным; как насчет других ядер?

Обновление: добавлен вывод "Системный монитор"

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
Peter.O
источник
Какие флаги вы используете для htop?
Sep332
sep332 ... я просто запускаю "htop" ... так что это случай по умолчанию.
Peter.O
Бинго! sep332 .. сделайте ответ из этого, и я отмечу, что он решен .. Вы заставили меня взглянуть на мои значения по умолчанию .... "H" - это кнопка переключения на "Скрыть пользовательские потоки" ... Когда все остальное терпит неудачу " Прочитайте "Справка по информации", но иногда полезный совет в правильном руководстве помогает больше .. Спасибо.
Peter.O
@ Peter.O: случайно понизился (тачпад мыши!). Я отменю это, если вы отредактируете свой пост.
SabreWolfy

Ответы:

24

Как вы сказали сами, вы можете нажать, Hчтобы показать пользовательские темы.

Просто для справки в будущем (и для удовольствия), давайте посчитаем загрузку процессора!

Немного предыстории:

В современной операционной системе есть Планировщик. Он направлен на то, чтобы все процессы и их потоки получали справедливую долю вычислительного времени. Я не буду вдаваться в подробности планирования (это действительно сложно). Но, в конце концов, есть нечто, называемое очередью запуска . Здесь все инструкции всех процессов выстраиваются в очередь, чтобы дождаться своей очереди.

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

Сортировка в этой очереди имеет отношение к приоритету процессов (также называемому «хорошим значением» - то есть процесс хорош в отношении системных ресурсов).

Длина очереди определяет нагрузку на систему. Например, загрузка 2,5 означает, что для каждой инструкции, с которой ЦПУ может работать в режиме реального времени , имеется 2,5 инструкции .

Кстати, в Linux эта нагрузка рассчитывается с интервалами в 10 мс (по умолчанию).

Теперь перейдем к процентным значениям загрузки процессора:

Представьте, что у вас есть два часа, один называется, tи он представляет собой реальное время . Он измеряет секунду за каждую секунду. Другие часы мы называем c. Он запускается только при наличии обработки. Это означает, что только когда процесс вычисляет что-то, часы работают. Это также называется временем процессора. Каждый процесс в системе «имеет» один из них.

Загрузка процессора теперь может быть рассчитана для одного процесса:

U = c / t = 0,5 с / 1 с = 0,5

или для всех процессов:

альтернативный текст

На многоядерном компьютере это может привести к значению 3,9, конечно, потому что ЦП может рассчитывать четыре секунды вычислений каждую секунду, если используется идеально.

Википедия предоставляет этот пример:

Программное приложение, работающее на 6-процессорной машине UNIX, создает три процесса UNIX для выполнения требований пользователя. Каждый из этих трех процессов создает два потока. Работа программного приложения равномерно распределяется на 6 независимых потоков исполнения, созданных для приложения. Если ожидание ресурсов не требуется, ожидается, что общее время ЦП будет в шесть раз превышать реальное время.

Вот небольшой фрагмент кода Python, который делает это

>>> import time
>>> t = time.time()
>>> c = time.clock()
>>> # the next line will take a while to compute
>>> tuple(tuple(i**0.2 for i in range(600)) for i in range(6000))
>>> print (time.clock() / (time.time() - t)) * 100, "%"
66.9384021612 %

В идеальном мире из этого можно сделать вывод, что загрузка системы составляет 100 - 66,93 = 33,1%. (Но на самом деле это было бы неправильно из-за сложных вещей, таких как ожидание ввода-вывода, планирование неэффективности и т. Д.)

В отличие от нагрузки , эти вычисления всегда будут давать значение от 0 до числа процессоров, то есть от 0 до 1 или от 0 до 100%. В настоящее время нет способа провести различие между машиной, на которой выполняются три задачи, использующей 100% ЦП, и машиной, выполняющей миллион задач, выполняющей едва ли любую работу, выполненную на одной из них, в том числе на 100%. Например, если вы пытаетесь сбалансировать кучу процессов на многих компьютерах, загрузка ЦП практически бесполезна. Загрузка это то, что вы хотите там.

Сейчас на самом деле существует более одного из этих часов времени обработки. Например, есть один для ожидания ввода / вывода. Таким образом, вы также можете рассчитать использование ресурсов ввода-вывода.

Возможно, это не помогло с оригинальным вопросом, но я надеюсь, что это интересно. :)

Стефано Палаццо
источник
Я действительно должен был включить значения неопределенности, потому что, используя этот простой метод, вычисления, вероятно, будут отключены на ± 1%, но я не хотел утомлять всех слишком сильно.
Стефано Палаццо
Спасибо за урок. Я знал многое из этого, но некоторые вещи были более конкретными, чем то, что я узнал.
NightwishFan