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

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

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

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


person elang    schedule 27.07.2010    source источник


Ответы (8)


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

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

person abdollar    schedule 11.10.2010
comment
Вы также можете нажать I для переключения режима Irix (в отличие от режима Solaris). Когда on, процент, отображаемый в списке процессов, относится к потоку ЦП. Когда off, указанный процент отображается относительно общей мощности ЦП (т. Е. ВСЕ потоки - то есть все ядра). - person 7heo.tk; 20.05.2015
comment
Это не относится к одному процессу, это показывает использование процессора всеми процессами на нескольких ядрах. - person m_vitaly; 29.12.2015
comment
Как мы можем передать 1 в качестве аргумента top, man страница говорит top -1, но жалуется! Было бы неплохо получить top -1 -n 1, чтобы получить одну итерацию top, но с отдельным отображением использования ЦП. - person quanta; 20.04.2020

Ты можешь использовать:

 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

Эта команда не отвечает на исходный вопрос, то есть не показывает использование ядра ЦП для определенного процесса.

person Kamran Bigdely    schedule 16.07.2011
comment
Думаю, это не совсем ответ на вопрос. Это то же самое, только если не запущены другие процессы. Кроме того, это не похоже на четырехъядерный процессор, скорее на восьмиядерный (возможно, четырехъядерный с включенным HT). - person the swine; 24.10.2015
comment
Это четырехъядерный процессор с включенным HT. - person Kamran Bigdely; 02.12.2016
comment
Не отвечает на исходный вопрос. Однако за то, что не упомянул об этом (-1) от меня. - person KGhatak; 15.12.2016
comment
Я согласен с @KGhatak, это не отвечает на исходный вопрос -1 - person jodag; 02.02.2017

вы можете использовать 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% надежным, иногда я вижу, что в первом случае сообщается, что два рабочих потока разделены на каждое ядро ​​ЦП, или в последнем случае сообщается, что два потока работают. такое же ядро ​​..

person mykhal    schedule 11.10.2010

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

person William Baker Morrison    schedule 05.10.2017

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

Это также показывает использование многопоточных процессов на уровне ядра.

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

person Nathan Kidd    schedule 26.04.2013
comment
Вы можете использовать функции read () и open () C lib, чтобы открыть псевдофайлы в / proc / pid / * и проанализировать любые нужные вам данные. - person GL2014; 26.01.2016

Я думал 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 будет помощь по значению опций.

person Elinx    schedule 15.03.2016

dstat -C 0,1,2,3 

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

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

dstat -C 3,7
person Ask and Learn    schedule 25.08.2016
comment
Как это будет иметь отношение к отдельному процессу? - person einpoklum; 26.04.2020

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

Метод состоит в том, чтобы установить 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 будет записан в текущую папку.

Используя комментарии других людей, чтобы добавить различный учет использования вверху, вы можете создать пакетный вывод для этой информации, а последний объединяет информацию с помощью сценария. Может быть, не так просто, как вы, сценарий, но я обнаружил, что верхняя часть предоставляет мне ВСЕ процессы, чтобы позже я мог резюмировать и фиксировать состояние в течение длительного периода времени, которое я мог бы пропустить в противном случае (необъяснимое внезапное использование ЦП из-за случайных процессов)

person Lucien Murray-Pitts    schedule 26.10.2015