Топ та ps не показують однакового результату процесора


54

Це пов’язано з цим питанням.

Коли я бігаю, topя отримую такий результат:

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

pid 3038використовує 18% процесор, проте під час роботи

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

результат - 5,5%. І це число, здається, не змінюється з часом (тобто, коли запускати ту саму команду трохи пізніше) ...

Чи psкоманда якось усереднює використання процесора?

Відповіді:


87

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%.

top з іншого боку, продовжуйте число дільниць і обчислюйте навантаження з часом.

psмогло б використовувати поточне використання - але це вимагатиме від нього багаторазового читання даних і переходу між кожним прочитаним. Це не так.

Розрахунок для ps% cpu

ps обчислює використання процесора таким чином:

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

;; Запуск секунди:
секунди = час роботи - ps_time
;; Використання:
cpu_usage = pu_time * 1000 / сек

друк: 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 * 1000 / 22,083 = 153 друк: 153/10 "." 153% 10 => 15.3

Отже, кількість надрукованих: час, який процес використовував процесор протягом свого життя. Як у прикладі вище. Це зробили за 15,3% свого життя. У 84,7% випадків він не надавав помилок на процесорі.

Пошук даних

ps, а також topвикористовує дані з файлів, що зберігаються під /proc/- або псевдофайловою системою інформації про процес .

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

При psобчисленні використання процесора він використовує два файли:

/ proc / uptime Продовження роботи системи (секунди) та кількість часу, витраченого в режимі очікування (секунди).
/ proc / [PID] / stat Інформація про стан процесу.
  • З uptimeнього використовується перше значення ( uptime ).
  • З [PID]/statнього використовується наступне:
 # Ім'я Опис
14 часу процесорного часу, проведеного в коді користувача, вимірюється в "джиффах"
Час процесора 15 разів, витрачений у коді ядра, виміряний в джиффах
16 скорочень процесорного часу, проведеного в коді користувача, включаючи час від дітей
Час процесора 17 часу, витраченого на код ядра, включаючи час від дітей 
22 час початку Час, коли процес розпочався, вимірюється в міг

Jiffie це годинник тик. Окрім того, він використовує різні методи, тобто sysconf(_SC_CLK_TCK), щоб отримати Герц системи (кількість тиків в секунду) - в кінцевому рахунку, використовуючи 100 як запасний результат після вичерпання інших варіантів.

Отже, якщо utimeце 1234, а Герц - 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>/etc.

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

Процес використовував процесор 38% часу за цей період.

Подивіться на код

Якщо ви хочете дізнатися, як psце робиться, і знаєте трохи C, зробіть (схоже, ви запускаєте Gnome Debain deriavnt) - приємне ставлення до коду щодо коментарів тощо:

apt-get source procps
cd procps*/ps
vim HACKING

Я можу оновлюватись додатковою інформацією про topпостійний моніторинг - або оснащення затримкою ака " ps" з поточним завантаженням процесора.
Руніум

2
Дійсно чудова відповідь!
Теодор

Як щодо розрахунку загального використання процесора у всій системі. Чи інструменти намагаються одержати використання процесора за допомогою знімка або усереднюють його з часом?
CMCDragonkai

4
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).

Хм, так, мені цікаво, як отримати це (миттєвий відсоток процесора) відps
Theodor

2
ви можете витягнути з найкращого прикладуtop -p 3343 -n1 | awk '/ R /{print $10}'
Рахул Патіль

1
Дивовижно. Я виявив, що awk: ing для pidпрацював краще, як уtop -p 3343 -n1 | awk '/ 3343 /{print $10}'
Theodor

1
Дякую "топ-р" - це приємно, я ніколи не помічав цього варіанту! Однак мені не подобається шукати PID, що робити, якщо випадково одні і ті ж цифри з’являться у розділі вільної пам'яті чи щось. У моїй системі інформація знаходиться на 8-му рядку та 9-му стовпці, отже, я роблю:top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
phil_w
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.