检索Linux上单个进程的CPU使用率和内存使用率?


164

我想获取Linux上单个进程的CPU和内存使用情况-我知道PID。希望我可以每秒获取一次,并使用“ watch”命令将其写入CSV。我可以使用什么命令从Linux命令行获取此信息?


11
属于SuperUser。
理查德

我们可以使用gdb调用getpid和top -p <that pid>吗?
mja

Answers:


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

(您可以省略“ cmd”,但这可能有助于调试)。

请注意,这给出了该进程在运行期间的平均CPU使用率。


6
假设是,如果您关心单个进程的内存使用量足以监视这样的情况,那么它将使用大量的内存,因此共享映射所导致的额外几兆字节不是问题。
caf

4
@Chaitanya:它管道| tail -n +2
咖啡厅

11
或者,您可以使用--noheader
hexacyanide

45
请记住,%cpu“是所用的CPU时间除以进程已运行的时间(cputime /实时比率),以百分比表示”(请参阅​​的手册页ps)。这不是真正的实时CPU使用率。例如,它也可能与top显示的内容完全不同。
xebeche

12
从Xebeche说正上方,ps -e -o pcpu,args显示CPU平均值的过程中,这显然是不的寿命你想要什么,如果它是一个长期运行的进程
亚历˚F


37

您可以使用以下名称获取过程名称

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

-C选项允许您使用进程名称而不知道它的pid。


如何包含de pid?我尝试了%pid $ PID pid,PID没有运气
Arnold Roa

@ArnoldRoa pid仅应工作。ps -C chrome -o pid,%cpu,%mem,cmd
穆罕默德·塔哈

28

使用pidstat(来自sysstat- 参考链接)。

例如,每隔5秒使用一次来监视这两个进程ID(12345和11223)

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

2
感谢您指出pidstat这是一个很棒的命令,并且对于编写脚本也很方便!
fduff 2015年

pidstat也给出了一个不错的平均值。遗憾的是,我还没有找到更优雅的方式pidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
Northern-bradley

24

ps 命令(不应使用):

top 命令(应使用):

用于top实时获取CPU使用率(当前短间隔):

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

会像这样回显: 78.6


这是获取当前CPU使用率的最准确答案,而不是整个过程生命周期的平均值。
特德·冯

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

相关:https : //unix.stackexchange.com/questions/554/how-to-monitor-cpu-memory-usage-of-a-single-process

在Ubuntu 16.04上测试。



5

如上述caf 的回答所述,ps和某些情况下的pidstat将为您提供pCPU的生命周期平均值。要获得更准确的结果,请使用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



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

PID-进程ID

etime-进程运行/实时持续时间

%cpu-CPU使用率

%mem-内存使用率

cmd-命令

将processname替换为要跟踪的任何进程,mysql nginx php-fpm等...


1

此处所有答案仅显示PID的内存百分比。

这是一个示例,该示例如何获取所有apache进程的rss内存使用量(以KB为单位),如果您只想观看特定的PID,请用“ grep PID”替换“ grep apache”:

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

对于那些苦苦挣扎一时想知道为什么所选答案不起作用的人:

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

没有空间ibetween %cpu,%mem


1

这是一个不错的技巧,可以实时跟踪一个或多个程序,同时还可以查看其他工具的输出: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


1

以下命令获取特定进程每40秒平均CPU和内存使用率(pid)

pidstat 40 -ru -p <pid>

我的情况的输出(前两行用于CPU使用,后两行用于内存):

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

0

(如果您使用的是MacOS 10.10,请尝试使用top的-c选项:

top -c a -pid PID

(此选项在其他Linux中不可用,已在Scientific Linux el6和RHEL6上尝试过)


0

上面列出了最重要的cpu​​和内存消耗过程

        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上单个进程的CPU和内存使用率,或者使用以下命令可以获取使用率最高的10个CPU进程

ps -aux --sort -pcpu | 头-n 11

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.