Как измерить отдельное использование ядра процессора для процесса? - PullRequest
101 голосов
/ 27 июля 2010

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

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

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

Ответы [ 8 ]

118 голосов
/ 12 октября 2010

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

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

72 голосов
/ 16 июля 2011

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

 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

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

35 голосов
/ 12 октября 2010

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

9 голосов
/ 05 октября 2017

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

4 голосов
/ 26 апреля 2013

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

2 голосов
/ 25 августа 2016
dstat -C 0,1,2,3 

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

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

dstat -C 3,7
1 голос
/ 15 марта 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 можно узнать из этого урока: статистика процессора1019 *, также perf help stat поможет понять значение параметров.

0 голосов
/ 26 октября 2015

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

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

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

...