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

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

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

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

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

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

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

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

  • Понимание вывода верхней команды на многоядерном компьютере ARM
  • Общее использование ЦП и использование ЦП в списке процессов различаются в верхней реализации FreeBSD?
  • контролировать множественные пипы с верхним
  • Почему диапазон нагрузки не равен 0-1 + для всех процессоров вместе?
  • Инструмент для просмотра верхних N элементов в потоке
  • Почему мой процессор тратит столько времени на систему?
  • iotop, но для конкретного диска?
  • Можно ли получить столбец PWD в верхнем выпуске?
  • 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

    Что означают эти два числа соответственно в статистике d-d «a + b records»?

    Пост-скрипт не запускается после установки

    Есть ли преимущества использования Iceweasel и Firefox?

    Почему запрос пароля немного отстает после ввода имени пользователя в tty?

    Как я могу заставить программу unix `pass` играть хорошо с` ssh` внутри виртуального терминала Linux?

    Windows 7 для Linux: установка без CD / DVD или USB-накопителя

    контролировать файловые системы linux с помощью df

    Arch: не удается открыть арбитр ядра, нет многоплоской поддержки

    Где значения параметров устройства, начинающиеся с «Monitor-xyz», происходят из xorg.conf?

    Почему мой Linux продолжает терпеть крах?

    Выполнять команды как другого пользователя

    Каков резервный файл, созданный checkinstall?

    Высокое использование прерываний IO-APIC-fasteoi eth0

    Добавить vi на Busybox, который обрезается

    RHEL 6: отказ от зависимостей для обновления qgis rpm

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