2011-02-09 3 views
4

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

[[email protected] ~]$ 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 
[[email protected] ~]$ 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 
[[email protected] ~]$ 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 
[[email protected] ~]$ 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 
[[email protected] ~]$ 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 

Любая идея, что может быть проблема здесь?

+0

Не уверен, но я могу воспроизвести это. Запуск Kubuntu кармический. Я даже запускал процесс python в фоновом режиме, выполняя вычисления процессора. без изменений. – Falmarri

ответ

3

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

+0

Также на основе решения sysrqb и принятого ответа я теперь использую: top -b -n 2 -d1 | grep "Cpu (s)" | хвост -n + 2 –

4

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

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

Простое решение: показатели утилизации top -b -n 5 -d.2 | grep "Cpu(s)" | tail -n+2

8

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

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

1

Я побежал в этом вопросе, а также и сделал некоторые раскопки.

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

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

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

2

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

top -b -d 5 -n 2 | awk '$1 == "PID" {block_num++; next} block_num == 2 {sum += $9;} END {print sum}' 
Смежные вопросы