【问题标题】:Retrieve CPU usage and memory usage of a single process on Linux?检索Linux上单个进程的CPU使用率和内存使用率?
【发布时间】:2010-11-16 07:58:58
【问题描述】:

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

【问题讨论】:

  • 属于超级用户。
  • 我们可以用gdb调用getpid和top -p 吗?

标签: linux shell memory-management cpu-usage


【解决方案1】:
ps -p <pid> -o %cpu,%mem,cmd

(您可以不使用“cmd”,但这可能有助于调试)。

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

【讨论】:

  • 假设是,如果您关心单个进程的内存使用情况足以像这样监控它,那么它会使用大量内存,因此由于共享映射而产生的额外几兆字节不是问题。
  • @Chaitanya:通过| tail -n +2进行管道传输
  • 或者你可以使用 --noheader
  • 请记住,%cpu“是使用的 CPU 时间除以进程运行的时间(cputime/realtime 比率),以百分比表示”(参见 ps 的手册页)。这不是真正的及时 CPU 使用率。例如,它也可能与 top 显示的内容大不相同。
  • 正如上面 Xebeche 所说,ps -e -o pcpu,args 将显示进程生命周期内的 cpu 平均值,如果它是一个长时间运行的进程,这显然不是你想要的
【解决方案2】:

caf's answer 的变体: top -p &lt;pid&gt;

这会自动刷新 CPU 使用率,因此有利于监控。

【讨论】:

  • pgrep 完美配合:top -p $(pgrep process_name)
【解决方案3】:

ps 命令(不应使用):

top 命令(应该使用):

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

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

会像这样回显:78.6

【讨论】:

  • 这是获取当前 CPU 使用率的最准确答案,而不是进程生命周期内的平均值。
【解决方案4】:

您可以通过使用进程的名称来获取结果

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

-C 选项允许您在不知道它是 pid 的情况下使用进程名称。

【讨论】:

  • 如何包含 de pid?我试过 %pid $PID pid,PID 没有运气
  • @ArnoldRoa pid 只能工作。 ps -C chrome -o pid,%cpu,%mem,cmd
【解决方案5】:

使用 pidstat(来自 sysstat - Refer Link)。

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

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

【讨论】:

  • 感谢您指出 pidstat 这是一个很棒的命令,而且对于编写脚本也很方便!
  • pidstat 也给出了一个不错的平均值。可惜我没有找到更优雅的pidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
【解决方案6】:

启动一个程序并监控它

如果您想轻松地对可执行文件进行基准测试,此表单很有用:

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 上测试。

【讨论】:

    【解决方案7】:

    您可以使用 top -b 并 grep 出您想要的 pid(使用 -b 标志 top 在批处理模式下运行),或者也使用 -p 标志并指定 pid 而不使用 grep。

    【讨论】:

      【解决方案8】:

      正如上面caf's answer 中所评论的, 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
      

      【讨论】:

        【解决方案9】:

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

        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
        

        【讨论】:

          【解决方案10】:
          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
          

          【讨论】:

            【解决方案11】:

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

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

            %cpu,%mem 之间没有空格。

            【讨论】:

              【解决方案12】:

              要获取您的应用程序的内存使用情况(与它使用的共享库相反,您需要使用 Linux smaps 接口)。 This answer explains it well.

              【讨论】:

                【解决方案13】:
                ps aux|awk  '{print $2,$3,$4}'|grep PID
                

                其中第一列是PID,第二列是CPU使用率,第三列是内存使用率。

                【讨论】:

                  【解决方案14】:

                  (如果你是MacOS 10.10,试试top的accumulative -c选项:

                  top -c a -pid PID
                  

                  (其他linux没有这个选项,用Scientific Linux el6和RHEL6试过)

                  【讨论】:

                    【解决方案15】:
                    ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep
                    

                    PID - 进程 ID

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

                    %cpu - CPU 使用率

                    %mem - 内存使用率

                    cmd - 命令

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

                    【讨论】:

                      【解决方案16】:

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

                      下面是一个示例,说明如何获取所有 apache 进程的 rss 内存使用量(以 KB 为单位),如果您只想查看特定 PID,请将“grep apache”替换为“grep 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
                      

                      【讨论】:

                        【解决方案17】:

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

                        【讨论】:

                          【解决方案18】:

                          根据@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
                          

                          【讨论】:

                            【解决方案19】:

                            上面列出了最消耗cpu和内存的进程

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

                            【讨论】:

                              【解决方案20】:

                              根据@Neon 的回答,我的两分钱在这里:

                              pidstat -h -r -u -v -p $(ps aux | grep <process name> | awk '{print $2}' | tr '\n' ',')
                              

                              【讨论】:

                                【解决方案21】:

                                基于this answer,我们可以通过收集N samplessampling period T 来估算特定进程在特定时间内的平均CPU 和内存利用率,如下所示:

                                N=3;
                                T=1;
                                PROCESS_NAME="my_proc";
                                
                                top -b -c -n $(let tmp=N+1; echo $tmp) -d ${T} -p $(pgrep ${PROCESS_NAME}) | 
                                grep ${PROCESS_NAME} |  
                                tee /var/tmp/foo.log |
                                tail -n +2 | 
                                awk -v N=$N 'BEGIN{
                                                c=0; 
                                                m=0
                                            }{
                                                c=c+$9; 
                                                m=m+$10
                                            }END{
                                                printf("%s %s\n", c/N, m/N) 
                                            }';
                                

                                为了能够评估结果,我们将顶部的输出收集到/var/tmp/foo.log 文件中。预期的输出是这样的:

                                2.33333 6.9
                                

                                以及我们日志文件的内容:

                                196918 root      20   0   24.4g   1.3g 113872 S   0.0   6.9  39:58.15 my_proc
                                196918 root      20   0   24.4g   1.3g 113872 S   2.0   6.9  39:58.17 my_proc
                                196918 root      20   0   24.4g   1.3g 113872 S   3.0   6.9  39:58.20 my_proc
                                196918 root      20   0   24.4g   1.3g 113872 S   2.0   6.9  39:58.22 my_proc
                                

                                请注意,我们忽略 (tail -n +2) 第一次执行 top 命令。

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 2011-05-03
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2014-05-07
                                  相关资源
                                  最近更新 更多