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

165

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

SuperTux
источник
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
65

Вариант ответа кафе : top -p <pid>

Это автоматически обновляет загрузку ЦП, так что это хорошо для мониторинга.

Манки
источник
2
Прекрасно работает с pgrep:top -p $(pgrep process_name)
Матиасом Брауном
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

vikyd
источник
Это наиболее точный ответ, чтобы узнать текущее использование процессора, а не среднее значение за время существования процесса.
Тед Фенг
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
aviranh
источник
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
Patel95
источник
2

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

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

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

ZhaoGang
источник
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

Чтобы получить использование памяти только вашим приложением (в отличие от используемых совместно используемых библиотек, вам нужно использовать интерфейс Linux smaps). Этот ответ объясняет это хорошо .

Пол Биггар
источник
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)

Kieleth
источник
0

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

        ps axo %cpu,%mem,command | sort -nr | head
user8854776
источник
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
Val
источник
-2

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

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

Джотиш Редди
источник