Как измерить использование отдельного ядра ЦП для процесса?

115

Есть ли способ измерить использование процессора конкретным процессом по ядрам?

Я знаю, что top хорош для измерения использования ЦП всей системы по ядрам, а набор задач может предоставить информацию о том, на каком ядре ЦП разрешено запускать процесс.

Но как мне измерить использование ЦП конкретным процессом ядрами ЦП?

elang
источник

Ответы:

139

Вы все еще можете сделать это в топе . Во время работы top нажмите «1» на клавиатуре, затем отобразится загрузка ЦП на ядро.

Ограничьте отображаемые процессы, запустив этот конкретный процесс под определенной учетной записью пользователя, и используйте тип u, чтобы ограничить этого пользователя.

abdollar
источник
3
Вы также можете нажать, Iчтобы переключить режим Irix (в отличие от режима Solaris ). Когда on, процент, отображаемый в списке процессов, относится к потоку ЦП . Когда off, указанный процент отображается относительно общей мощности ЦП (то есть ВСЕ потоки, то есть все ядра).
7heo.tk
8
Это не относится к одному процессу, это показывает использование
ЦП
Как мы можем передать «1» в качестве аргумента top, manстраница говорит, top -1но жалуется! Было бы неплохо получить top -1 -n 1одну итерацию, topно с отдельным отображением использования ЦП.
Quanta
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).
KGhatak
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

вы можете обработать вывод и вычислить общий объем ЦП для каждого ядра ЦП.

К сожалению, этот подход не выглядит на 100% надежным, иногда я вижу, что в первом случае сообщается, что два рабочих потока разделены на каждое ядро ​​ЦП, или в последнем случае сообщается, что два потока работают. такое же ядро ​​..

mykhal
источник
13

htop дает хороший обзор использования отдельных ядер

WBM
источник
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 секундах, поэтому вам нужно будет перезапустить процесс, чтобы сбросить счетчик.

Натан Кидд
источник
Вы можете использовать функции read () и open () C lib, чтобы открыть псевдофайлы в / proc / pid / * и проанализировать любые нужные вам данные.
GL2014,
2
dstat -C 0,1,2,3 

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

Например, если вас интересуют только ядра 3 и 7, вы можете сделать

dstat -C 3,7
Спроси и узнай
источник
Как это будет иметь отношение к одному процессу?
einpoklum
1

У меня была только эта проблема , и я нашел подобный ответ здесь .

Метод состоит в том, чтобы установить topжелаемое, а затем нажать W(заглавная 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%)

В левом столбце указан конкретный индекс ЦП, а в крайнем правом столбце - использование ЦП. Если вы не укажете этот --no-aggrпараметр, результаты будут агрегированы. --pid=pidОпция поможет , если вы хотите контролировать процесс бега.

Попробуйте -a --per-coreили -a perf-socketтоже, что предоставит более секретную информацию.

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

elinx
источник