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

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

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

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

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

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

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

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

  • Периодически получать использование ЦП для одного процесса
  • Понимание вывода верхней команды на многоядерном компьютере ARM
  • Определение конкретного процессора, на котором выполняется процесс
  • Что означает число в скобках в столбце «команда» для процессов postgres?
  • htop не показывает процесс
  • Предупреждение при завершении процесса
  • CPU и Load Average Conflict на сервере EC2
  • Почему nautilus в фоновом режиме занимает столько IO и CPU при входе в систему, и как это разрешить, или это ошибка?
  • 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). 
    Interesting Posts

    Интерфейс не работает с интерфейсом ip link set up

    Я перепутал свой zshrc на удаленном сервере, и теперь я не могу запускать какие-либо команды!

    Почему в этом примере происходит расширение параметра до расширения фигурной скобки?

    Разрешение спецификации:% i и% I разница?

    Как получить выход из удаленной оболочки

    Интернет-соединение теряется примерно через 10 секунд

    Компиляция Apache с другой версией glibc

    Почему я запретил доступ к phpmyadmin?

    частота появления

    установка snmp-расширений в snmpd.conf

    RC-сценарий, который выдается на передний план по определенным критериям

    как мы можем использовать awk для получения нескольких слов после значительного слова?

    как java установить PATH моей системы Debian 7.3, чтобы связать версию Java, которую я хочу

    Терминал Gnome — скрыть файлы тильды, созданные Emacs

    Невозможно назначить вывод вложенных команд переменной в bash

    Linux и Unix - лучшая ОС в мире.