команда top top всегда возвращает один и тот же результат - PullRequest
5 голосов
/ 09 февраля 2011

При запуске 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

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

Ответы [ 5 ]

8 голосов
/ 08 февраля 2012

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

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

5 голосов
/ 09 февраля 2011

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

4 голосов
/ 09 февраля 2011

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

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

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

2 голосов
/ 23 июля 2015

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

top -b -d 5 -n 2 | awk '$1 == "PID" {block_num++; next} block_num == 2 {sum += $9;} END {print sum}'
1 голос
/ 18 февраля 2013

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

Если вы 'man top' и прокрутите waaaay вниз, вы найдете следующее из раздела 7,.

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

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

...