Top и ps не показывают тот же результат процессора

Это связано с этим вопросом.

Когда я бегу top я получаю следующий результат:

введите описание изображения здесь

pid 3038 использует 18% процессор, однако при запуске

введите описание изображения здесь

результат составляет 5,5%. И это число не меняется со временем (т. Е. При запуске одной и той же команды немного позже) …

Действительно ли команда ps каким-то образом усредняет использование процессора?

2 Solutions collect form web for “Top и ps не показывают тот же результат процессора”

man ps в разделе NOTES .

  CPU usage is currently expressed as the percentage of time spent running during the entire lifetime of a process. This is not ideal, and it does not conform to the standards that ps otherwise conforms to. CPU usage is unlikely to add up to exactly 100%. 

И, предположите, вы знаете, но вы также можете сделать:

 top -p <PID> 

Изменить : как ваш комментарий к другому ответу;

« Хм, да, мне интересно, как это получить (мгновенный процент процессора) от ps »

Короткий ответ: вы не можете.

Почему это так?

Это как просить кого-то рассчитать скорость автомобиля с картины.

В то время как top является инструментом мониторинга, ps является инструментом моментального снимка. Подумайте об этом так: в любой момент процесс использует процессор или нет. Таким образом, вы получаете либо 0%, либо 100% нагрузки в тот момент.

Давать: Если ps должен давать мгновенное использование ЦП, это будет 0% или 100%.

с другой стороны, держат номера опроса и рассчитывают нагрузку с течением времени.

ps мог бы использовать текущее использование, но для этого требовалось бы многократно считывать данные и спать между каждым чтением. Это не так.

Расчет для ps% cpu

ps вычисляет использование ЦП следующим образом:

 uptime = полная система времени.
 ps_time = время начала процесса, измеренное в секундах от загрузки.
 pu_time = общий процесс времени использует процессор.

 ;;  Секундный процесс:
 секунд = время безотказной работы - ps_time
 ;;  Применение:
 cpu_usage = pu_time * 1000 / секунд

 print: cpu_usage / 10 "."  cpu_usage% 10


Пример: время безотказной работы = 344 545 ps_time = 322,462 pu_time = 3,383 секунды = 344,545 - 322,462 = 22,083 cpu_usage = 3,383 * 1,000 / 22,083 = 153 print: 153/10 "." 153% 10 => 15,3

Таким образом, напечатанное число: время, в течение которого процесс использовал процессор во время его жизни. Как и в примере выше. Это произошло в 15,3% от его срока службы. В 84,7% случаев он не прослушивал CPU.

Поиск данных

ps , а также top , использует данные из файлов, хранящихся в /proc/ – или в псевдо-файловой системе информации процесса .

У вас есть файлы в корне /proc/ которые имеют различную информацию об общем состоянии системы. Кроме того, каждый процесс имеет свою собственную подпапку /proc/<PID>/ где хранятся данные, специфичные для процесса. Так, например, процесс из вашего вопроса имел папку в /proc/3038/ .

Когда ps вычисляет использование ЦП, он использует два файла:

 / proc / uptime Время работы системы (в секундах) и время, затрачиваемое в режиме ожидания (в секундах). 
  / proc / [PID] / stat Информация о состоянии процесса. 
 
  • От uptime оно использует первое значение ( время безотказной работы ).
  • В [PID]/stat используется следующее:
 # Название Описание 
  14 упр. Процессорного времени, затраченного на код пользователя, измеряемый в jiffies 
  15 время на процессорное время, затраченное на код ядра, измеренное в jiffies 
  16 процессорное время, затрачиваемое на код пользователя, включая время от детей 
  17 cstime CPU время, затраченное на код ядра, включая время от детей  
  22 starttime Время начала процесса, измеренное в jiffies 
 

Jiffie – это тактик . Таким образом, он использует различные методы, т. sysconf(_SC_CLK_TCK) , для получения Hertz системы (количество тиков в секунду) – в конечном счете, используя 100 в качестве спада после исчерпания других параметров.

Так что если utime 1234, а Hertz – 100, тогда:

 seconds = utime / Hertz = 1234 / 100 = 12.34 

Фактический расчет производится с помощью:

 total_time = utime + stime IF include_dead_children total_time = total_time + cutime + cstime ENDIF seconds = uptime - starttime / Hertz pcpu = (total_time * 1000 / Hertz) / seconds print: "%CPU" pcpu / 10 "." pcpu % 10 

Пример (вывод из пользовательского сценария Bash):

 $ ./psw2 30894 System information uptime : 353,512 seconds idle : 0 Process information PID : 30894 filename : plugin-containe utime : 421,951 jiffies 4,219 seconds stime : 63,334 jiffies 633 seconds cutime : 0 jiffies 0 seconds cstime : 1 jiffies 0 seconds starttime : 32,246,240 jiffies 322,462 seconds Process run time : 31,050 Process CPU time : 485,286 jiffies 4,852 seconds CPU usage since birth: 15.6% 

Вычисление «текущей» нагрузки с помощью ps

Это (бит?) Теневое усилие, но ОК. Позволяет идти.

Можно использовать время, предоставленное ps и вычислить использование ЦП из этого. Когда вы думаете об этом, это может быть весьма полезно, с некоторыми ограничениями.

Это может быть полезно для вычисления использования ЦП в течение более длительного периода. Т.е. говорят, что вы хотите контролировать среднюю загрузку процессора plugin-container в Firefox, выполняя некоторые связанные с Firefox задачи.

Используя вывод:

$ ps -p -o cputime, etimes

 CODE HEADER DESCRIPTION cputime TIME cumulative CPU time, "[DD-]hh:mm:ss" format. (alias time). etime ELAPSED elapsed time since the process was started, [DD-]hh:]mm:ss. etimes ELAPSED elapsed time since the process was started, in seconds. 

Я использую etime над etimes в этом примере, при расчетах, только для того, чтобы быть более понятным. Также я добавляю% cpu для «забавы». В сценарии bash, очевидно, будет использоваться etimes – или лучше читать из /proc/<PID>/ и т. Д.

 Start: $ ps -p 30894 -o %cpu,cputime,etime,etimes %CPU TIME ELAPSED ELAPSED 5.9 00:13:55 03:53:56 14036 End: %CPU TIME ELAPSED ELAPSED 6.2 00:14:45 03:56:07 14167 Calculate times: 13 * 60 + 55 = 835 (cputime this far) 3 * 3,600 + 53 * 60 + 56 = 14,036 (time running this far) 14 * 60 + 45 = 885 (cputime at end) 3 * 3,600 + 56 * 60 + 7 = 14,167 (time running at end) Calculate percent load: ((885 - 835) / (14,167 - 14,036)) * 100 = 38 

В течение этого периода процесс использовал CPU 38% времени.

Посмотрите на код

Если вы хотите знать, как это делает ps , и знаете немного C, сделайте (похоже, что вы запустите Gnome Debain deriavnt) – хорошее отношение в коде относительно комментариев и т. Д .:

 apt-get source procps cd procps*/ps vim HACKING 
 man top %CPU -- CPU usage The task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time. In a true SMP environment, if 'Irix mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs. You toggle 'Irix/Solaris' modes with the 'I' interactive command. man ps %cpu %CPU cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu). 
  • Почему диапазон нагрузки не равен 0-1 + для всех процессоров вместе?
  • Как отображать meminfo в мегабайтах в верхней части?
  • Почему значение VSIZE в верхней части отличается от значения VSZ (размер виртуального набора) в ps?
  • Зачем обрабатывать CPU% Использование больше, чем общее время процессора
  • SSH дважды и запустить команду, экранируя символ?
  • Разве не должно быть больше RAM, чем это?
  • ATOP показывает красную линию vmcom и vmlim. Что это значит?
  • контролировать множественные пипы с верхним
  • Почему я не могу использовать весь 100% -ный потенциал процессора?
  • Как заставить все процессы работать на каждом ядре процессора в Ubuntu?
  • верхняя команда на многоядерном процессоре
  • Должен ли я заботиться о приложениях, которые увеличивают загрузку системы во избежание перегрева?
  • Linux и Unix - лучшая ОС в мире.