Як виміряти окреме використання основного процесора для процесу?


115

Чи є спосіб виміряти конкретне використання процесора процесорами ядрами?

Я знаю, що верхня частина корисна для вимірювання використання CPU всієї системи ядрами та набором завдань, що може надати інформацію про те, яке ядро ​​CPU дозволено для запуску процесу.

Але як я можу виміряти використання процесора ядрами конкретного процесу?

Відповіді:


139

Ви все ще можете це зробити вгорі . Поки верхній біг працює, натисніть «1» на клавіатурі, після чого відображатиметься використання процесора на ядро.

Обмежте процеси, показані тим, що цей конкретний процес запускається під певним обліковим записом користувача та використовуйте Тип 'u' для обмеження цього користувача


3
Ви також можете натиснути, Iщоб увімкнути режим Irix (на відміну від режиму Solaris ). Коли on, відсоток, відображений у списку процесів, є відносно потоку процесора . Коли offзазначений відсоток відображається відносно загальної ємності процесора (тобто ВСІ потоки - також усі ядра).
7heo.tk

8
Це не характерно для одного процесу, це показує використання процесора всіх процесів у декількох ядрах
m_vitaly

Як ми можемо передати "1" як аргумент top, manговорить сторінка, top -1але вона скаржиться! Було б непогано отримати top -1 -n 1одну ітерацію, topале з окремим використанням процесора.
кванта

76

Ви можете використовувати:

 mpstat -P ALL 1

Він показує, наскільки кожне ядро ​​зайняте, і оновляється автоматично кожну секунду. Вихід був би приблизно таким (на чотирьохядерному процесорі):

10:54:41 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:54:42 PM  all    8.20    0.12    0.75    0.00    0.00    0.00    0.00    0.00   90.93
10:54:42 PM    0   24.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   74.00
10:54:42 PM    1   22.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   76.00
10:54:42 PM    2    2.02    1.01    0.00    0.00    0.00    0.00    0.00    0.00   96.97
10:54:42 PM    3    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
10:54:42 PM    4   14.15    0.00    1.89    0.00    0.00    0.00    0.00    0.00   83.96
10:54:42 PM    5    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
10:54:42 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
10:54:42 PM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

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


3
Я думаю, що це насправді не відповідає на питання. Це лише те саме, якщо не виконуються інші процеси. Крім того, це, здається, не є чотирьохядерним процесором, більше схожим на восьмиядерний процесор (можливо, чотирьохядерний з підтримкою HT).
свиня

1
Це чотирьохядерний з підтримкою HT.
Камран Бігделі

Не відповідає на оригінальне запитання. Однак за те, щоб не згадати про це (-1) від мене.
КГатак

1
Я погоджуюся з @KGhatak, це не відповідає на початкове запитання -1
jodag

41

ви можете використовувати ps.
наприклад, з процесом python з двома зайнятими потоками на двоядерному процесорі:

$ ps -p 29492 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
29492 29492   1  0.0
29492 29493   1 48.7
29492 29494   1 51.9

(PSR - це процесорний ідентифікатор, якому потоку призначено)

ви бачите, що потоки працюють на тому ж ядрі процесора (через GIL)

запускаючи той самий скрипт python у jython, ми бачимо, що скрипт використовує обидва ядра (і є багато інших служб або будь-яких потоків, які майже не працюють):

$ ps -p 28671 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
28671 28671   1  0.0
28671 28672   0  4.4
28671 28673   0  0.6
28671 28674   0  0.5
28671 28675   0  2.3
28671 28676   0  0.0
28671 28677   1  0.0
28671 28678   1  0.0
28671 28679   0  4.6
28671 28680   0  4.4
28671 28681   1  0.0
28671 28682   1  0.0
28671 28721   1  0.0
28671 28729   0 88.6
28671 28730   1 88.5

Ви можете обробити вихід і обчислити загальний процесор для кожного ядра CPU.

На жаль, цей підхід не здається на 100% надійним, іноді я бачу, що в першому випадку, як повідомляється, два робочих потоки відокремлюються до кожного ядра процесора, або, в останньому випадку, два потоки повідомляються про те саме ядро ​​..


13

htop дає хороший огляд використання індивідуального ядра


4

psРозчин майже те , що мені було потрібно , і з деяким Башем додачі робить саме те , що запитав оригінальний питання: побачити за основне використання конкретних процесів

Це також показує використання багатопотокових процесів на одне ядро .

Використовуйте як: cpustat `pgrep processname`` pgrep otherprocessname` ...

#!/bin/bash

pids=()
while [ $# != 0 ]; do
        pids=("${pids[@]}" "$1")
        shift
done

if [ -z "${pids[0]}" ]; then
        echo "Usage: $0 <pid1> [pid2] ..."
        exit 1
fi

for pid in "${pids[@]}"; do
        if [ ! -e /proc/$pid ]; then
                echo "Error: pid $pid doesn't exist"
                exit 1
        fi
done

while [ true ]; do
        echo -e "\033[H\033[J"
        for pid in "${pids[@]}"; do
                ps -p $pid -L -o pid,tid,psr,pcpu,comm=
        done
        sleep 1
done

Примітка. Ця статистика базується на тривалості процесу , а не на останніх X секундах, тому вам потрібно буде перезапустити процес, щоб скинути лічильник.


Ви можете використовувати функції C lib read () та open (), щоб відкрити псевдофайли в / proc / pid / * та проаналізувати всі необхідні вам дані.
GL2014

2
dstat -C 0,1,2,3 

Також дасть вам можливість використання процесора перших 4 ядер. Звичайно, якщо у вас є 32 ядра, то ця команда стає трохи довшою, але корисною, якщо вас цікавить лише кілька ядер.

Наприклад, якщо вас цікавлять лише ядра 3 та 7, то ви могли б це зробити

dstat -C 3,7

Як це буде стосуватися одного процесу?
einpoklum

1

У мене була саме ця проблема, і я знайшов подібну відповідь тут .

Метод полягає в тому, щоб встановити topтак, як ви хочете, а потім натисніть W(велика Вт). Це зберігає topпоточний макет у файл конфігурації у $ HOME / .toprc

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

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

1) Перейменуйте двійкові

  ln -s /usr/bin/top top2
  ./top2

Тепер .top2rcбуде записано у ваш $ HOME

2) Встановіть $ HOME на якийсь альтернативний шлях, оскільки він запише свій конфігураційний файл у файл $ HOME / .binary-name.rc

HOME=./
top

Тепер .toprcбуде записано у поточну папку.

Використовуючи коментарі інших людей для додавання різних обліку використання вгорі, ви можете створити пакетний висновок для цієї інформації, а останній об'єднує інформацію за допомогою сценарію. Можливо, не так просто, як у вас сценарій, але я знайшов верх, щоб забезпечити мені ВСІ процеси, щоб пізніше я міг переглядати та захоплювати стан протягом тривалого періоду, який я міг би пропустити в іншому випадку (незрозуміле раптове використання процесора через бродячі процеси)


1

Я думав perf stat, що вам потрібно.

Він показує конкретне використання процесу, коли ви вказуєте --cpu=listпараметр. Ось приклад моніторингу використання процесора для створення проекту за допомогою perf stat --cpu=0-7 --no-aggr -- make all -jкоманди. Вихід:

CPU0         119254.719293 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU1         119254.724776 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU2         119254.724179 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU3         119254.720833 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU4         119254.714109 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU5         119254.727721 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU6         119254.723447 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU7         119254.722418 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU0                 8,108 context-switches          #    0.068 K/sec                    (100.00%)
CPU1                26,494 context-switches                                              (100.00%)
CPU2                10,193 context-switches                                              (100.00%)
CPU3                12,298 context-switches                                              (100.00%)
CPU4                16,179 context-switches                                              (100.00%)
CPU5                57,389 context-switches                                              (100.00%)
CPU6                 8,485 context-switches                                              (100.00%)
CPU7                10,845 context-switches                                              (100.00%)
CPU0                   167 cpu-migrations            #    0.001 K/sec                    (100.00%)
CPU1                    80 cpu-migrations                                                (100.00%)
CPU2                   165 cpu-migrations                                                (100.00%)
CPU3                   139 cpu-migrations                                                (100.00%)
CPU4                   136 cpu-migrations                                                (100.00%)
CPU5                   175 cpu-migrations                                                (100.00%)
CPU6                   256 cpu-migrations                                                (100.00%)
CPU7                   195 cpu-migrations                                                (100.00%)

Лівий стовпець - це специфічний індекс CPU, а правий самий стовпчик - це використання процесора. Якщо не вказати --no-aggrпараметр, результат зведений разом. Цей --pid=pidпараметр допоможе, якщо ви хочете контролювати запущений процес.

Спробуйте -a --per-coreабо -a perf-socketтеж, де буде представлено більше секретної інформації.

Більше про використання perf statможна побачити в цьому підручнику: статистика perf cpu , також perf help statдопоможе про значення параметрів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.