первая итерация команды top всегда возвращает один и тот же результат

При запуске top -b -n 1 команда всегда возвращает одни и те же значения ЦП. Рассмотрим следующий тестовый запуск 5 раз подряд:

[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 39.8%us, 27.7%sy,  0.0%ni, 31.3%id,  0.0%wa,  0.0%hi,  1.2%si,  0.0%st
Cpu(s): 39.0%us, 35.4%sy,  0.0%ni, 23.2%id,  0.0%wa,  0.0%hi,  1.2%si,  1.2%st
Cpu(s): 41.2%us, 34.1%sy,  0.0%ni, 15.3%id,  1.2%wa,  0.0%hi,  2.4%si,  5.9%st
Cpu(s): 59.0%us, 30.1%sy,  0.0%ni,  4.8%id,  0.0%wa,  0.0%hi,  3.6%si,  2.4%st
[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 18.9%us, 17.8%sy,  0.0%ni, 63.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 18.8%us, 21.2%sy,  0.0%ni, 55.3%id,  2.4%wa,  0.0%hi,  1.2%si,  1.2%st
Cpu(s): 29.4%us, 24.7%sy,  0.0%ni, 45.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 60.5%us, 24.4%sy,  0.0%ni, 11.6%id,  1.2%wa,  0.0%hi,  1.2%si,  1.2%st
[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 43.4%us, 38.6%sy,  0.0%ni, 15.7%id,  0.0%wa,  0.0%hi,  1.2%si,  1.2%st
Cpu(s): 55.3%us, 40.0%sy,  0.0%ni,  4.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 39.5%us, 48.8%sy,  0.0%ni,  5.8%id,  1.2%wa,  0.0%hi,  1.2%si,  3.5%st
Cpu(s): 40.7%us, 55.6%sy,  0.0%ni,  2.5%id,  0.0%wa,  0.0%hi,  0.0%si,  1.2%st
[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 27.1%us, 10.6%sy,  0.0%ni, 61.2%id,  1.2%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 25.3%us,  5.7%sy,  0.0%ni, 67.8%id,  0.0%wa,  0.0%hi,  0.0%si,  1.1%st
Cpu(s): 15.5%us, 16.7%sy,  0.0%ni, 64.3%id,  0.0%wa,  0.0%hi,  0.0%si,  3.6%st
Cpu(s): 57.3%us, 11.2%sy,  0.0%ni, 30.3%id,  0.0%wa,  0.0%hi,  0.0%si,  1.1%st
[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 44.0%us,  6.0%sy,  0.0%ni, 42.9%id,  0.0%wa,  0.0%hi,  3.6%si,  3.6%st
Cpu(s): 45.8%us,  9.6%sy,  0.0%ni, 44.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 34.5%us,  8.3%sy,  0.0%ni, 57.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 38.6%us, 14.5%sy,  0.0%ni, 45.8%id,  0.0%wa,  0.0%hi,  0.0%si,  1.2%st

Есть идеи, в чем здесь может быть проблема?


person Yacine Filali    schedule 09.02.2011    source источник
comment
Не уверен, но я могу воспроизвести это. Запуск кубунту кармический. Я даже запускал процесс Python в фоновом режиме, выполняя вычисления ЦП. без изменений.   -  person Falmarri    schedule 09.02.2011


Ответы (5)


Показатели использования ЦП рассчитываются как среднее значение за интервал времени. Для первой итерации этот временной интервал равен «от загрузки системы до настоящего момента»; для последующих итераций временной интервал равен «от последней итерации до настоящего времени».

person caf    schedule 09.02.2011
comment
Также на основе решения sysrqb и принятого ответа я теперь использую: top -b -n 2 -d1 | grep ЦП | хвост -n+2 - person Yacine Filali; 11.02.2011

если кто-то ищет одну строку, получите значение процессора, попробуйте это

top -b -n 5 -d.2 | grep "Cpu" | tail -n1 | awk '{print($2)}' | cut -d'%' -f 1

person crickeys    schedule 08.02.2012

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

Вы можете увидеть тот же эффект, если запустите top в интерактивном режиме и быстро изучите первую партию результатов, которые он возвращает.

Простое решение: top -b -n 5 -d.2 | grep "Cpu(s)" | tail -n+2

person rmmh    schedule 09.02.2011

Я тоже столкнулся с этой проблемой и немного покопался.

Если вы нажмете «наверху» и прокрутите немного вниз, вы найдете следующее из раздела 7. . .

Команда top вычисляет ЦП, просматривая изменение значений времени ЦП между выборками. При первом запуске у него нет предыдущего образца для сравнения, поэтому эти начальные значения представляют собой проценты с момента загрузки. Это означает, что вам нужно как минимум два цикла, или вы должны игнорировать итоговый вывод из первого цикла. Это проблема, например, для пакетного режима. Существует возможный обходной путь, если вы определяете переменную среды CPULOOP=1. Команда top запустит один дополнительный скрытый цикл для данных ЦП перед стандартным выводом.

Надеюсь это поможет!

person rarnhart    schedule 18.02.2013

Вот пример вычисления общего использования ЦП для ВСЕХ процессов сверху. Я использую флаг -d, чтобы увеличить интервал по умолчанию, чтобы сгладить значение. Не использовать хвост, потому что заголовок может относиться к дистрибутиву Linux.

top -b -d 5 -n 2 | awk '$1 == "PID" {block_num++; next} block_num == 2 {sum += $9;} END {print sum}'
person Sergei Rodionov    schedule 23.07.2015