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


165

Я хочу получить использование процессора и памяти для одного процесса в Linux - я знаю PID. Надеюсь, я могу получить его каждую секунду и записать его в CSV, используя команду «watch». Какую команду я могу использовать, чтобы получить эту информацию из командной строки Linux?


11
Принадлежит SuperUser.
Ричард

Можем ли мы использовать gdb для вызова getpid и top -p <этот pid>?
мя

Ответы:


226
ps -p <pid> -o %cpu,%mem,cmd

(Вы можете не указывать "cmd", но это может помочь при отладке).

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


6
Предполагается, что если вы заботитесь об использовании памяти одним процессом, достаточным для такого мониторинга, он использует значительный объем памяти, так что лишние несколько мегабайт из-за общих сопоставлений не являются проблемой.
Кафе

5
@Chaitanya: трубка через| tail -n +2
кафе

11
Или вы могли бы использовать --noheader
hexacyanide

45
Помните, что% cpu "- это используемое время ЦП, деленное на время выполнения процесса (отношение cputime / realtime), выраженное в процентах" (см. Справочную страницу ps). Это не реальное время загрузки процессора. Это также может сильно отличаться от того top, что показывает, например.
xebeche

12
как сказано выше в Xebeche, ps -e -o pcpu,argsпокажет среднее значение процессора за время жизни процесса, что явно не то, что вы хотите, если это длительный процесс
Alex F


37

Вы можете получить результаты по названию процесса, используя

ps -C chrome -o %cpu,%mem,cmd

-Cопция позволяет использовать имя процесса , не зная , что это идентификатор процесса .


как включить также de pid? я попробовал% pid $ PID pid, PID без удачи
Арнольд Роа

@ArnoldRoa pidтолько должен работать. ps -C chrome -o pid,%cpu,%mem,cmd
Мухаммед Таха

28

Используйте pidstat (из sysstat - см . Ссылку ).

например, чтобы контролировать эти два идентификатора процесса (12345 и 11223) каждые 5 секунд, используйте

$ pidstat -h -r -u -v -p 12345,11223 5

2
спасибо за указание, pidstatчто это отличная команда, и очень удобная для сценариев!
fduff

pidstatтакже дает хороший средний. просто позор, я не нашел более элегантный способpidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
Northern-Bradley

24

ps Команда (не следует использовать):

top команда (должна использовать):

Используйте topдля получения загрузки процессора в режиме реального времени (текущий короткий интервал):

top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk '{print $9}'

будет повторяться как: 78.6


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

15

Запустите программу и следите за ней

Эта форма полезна, если вы хотите легко сравнить исполняемый файл:

topp() (
  $* &>/dev/null &
  pid="$!"
  trap ':' INT
  echo 'CPU  MEM'
  while sleep 1; do ps --no-headers -o '%cpu,%mem' -p "$pid"; done
  kill "$pid"
)
topp ./myprog arg1 arg2

Теперь, когда вы нажимаете Ctrl + C, он выходит из программы и прекращает мониторинг. Пример вывода:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

Связанный: /unix/554/how-to-monitor-cpu-memory-usage-of-a-single-process

Проверено на Ubuntu 16.04.


5

Вы можете использовать top -bи извлекать pid, который вы хотите (с -bверхом флага в пакетном режиме), или также использовать -pфлаг и указывать pid без использования grep.


5

Как отмечалось в ответе caf выше, ps и в некоторых случаях pidstat даст вам среднее время жизни pCPU. Для получения более точных результатов используйте top. Если вам нужно запустить top после запуска:

top -b -n 1 -p <PID>

или для обработки только данных и заголовка:

top -b -n 1 -p <PID> | tail -3 | head -2

без заголовков:

top -b -n 1 -p <PID> | tail -2 | head -1

3
ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr

или за процесс

ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr |grep mysql

2

Для тех, кто долго боролся с вопросом, почему выбранный ответ не работает:

ps -p <pid> -o %cpu,%mem

Никакого ПРОСТРАНСТВА между %cpu,и %mem.


2

Следующая команда получает среднее значение использования процессора и памяти каждые 40 секунд для определенного процесса (pid)

pidstat 40 -ru -p <pid>

Вывод для моего случая (первые две строки для загрузки процессора, вторые две строки для памяти):

02:15:07 PM       PID    %usr %system  %guest    %CPU   CPU  Command
02:15:47 PM     24563    0.65    0.07    0.00    0.73     3  java

02:15:07 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
02:15:47 PM     24563      6.95      0.00 13047972 2123268   6.52  java


1
ps aux|awk  '{print $2,$3,$4}'|grep PID

где первый столбец - это PID, загрузка ЦП во втором столбце, использование памяти в третьем столбце.


1
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep

PID - идентификатор процесса

etime - запуск процесса / продолжительность в реальном времени

% cpu - загрузка процессора

% mem - использование памяти

cmd - команда

Замените имя процесса любым процессом, который вы хотите отслеживать, mysql nginx php-fpm и т. Д.


1

Все ответы здесь показывают только процент памяти для PID.

Вот пример того, как получить использование rss-памяти в КБ для всех процессов apache, замените «grep apache» на «grep PID», если вы просто хотите посмотреть конкретный PID:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$6}'"

Это печатает:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$6}'                                                                                                                                                                                                          
Thu Jan 25 15:44:13 2018

12588 9328
12589 8700
12590 9392
12591 9340
12592 8700
12811 15200
15453 9340
15693 3800
15694 2352
15695 1352
15697 948
22896 9360

С CPU%:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$3,\$6}'"

Вывод:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$3,$6}'                                                                                                                                                                                                       
Thu Jan 25 15:46:00 2018

12588 0.0 9328
12589 0.0 8700
12590 0.0 9392
12591 0.0 9340
12592 0.0 8700
12811 0.0 15200
15453 0.0 9340
15778 0.0 3800
15779 0.0 2352
15780 0.0 1348
15782 0.0 948
22896 0.0 9360

1

Это хороший прием, чтобы следить за одной или несколькими программами в режиме реального времени, а также наблюдать за выходом какого-либо другого инструмента: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


0

(Если вы находитесь в MacOS 10.10, попробуйте накопительную опцию -c top:

top -c a -pid PID

(Этот параметр недоступен в других linux, пробовал с Scientific Linux el6 и RHEL6)


0

Выше приведен список процессоров и процессоров, занимающих много памяти

        ps axo %cpu,%mem,command | sort -nr | head

0

Судя по ответу @ caf, это хорошо работает для меня.

Рассчитать среднее значение для данного PID:

measure.sh

times=100
total=0
for i in $(seq 1 $times)
do
   OUTPUT=$(top -b -n 1 -d 0.1 -p $1 | tail -1 | awk '{print $9}')
   echo -n "$i time: ${OUTPUT}"\\r
   total=`echo "$total + $OUTPUT" | bc -l`
done
#echo "Average: $total / $times" | bc

average=`echo "scale=2; $total / $times" | bc`
echo "Average: $average"

Использование:

# send PID as argument
sh measure.sh 3282

-2

Использование ЦП и памяти одного процесса в Linux, или вы можете получить топ-10 процессоров, используемых процессором, используя команду ниже

ps -aux --sort -pcpu | голова -n 11

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.